Ruby on rails Rails:以嵌套形式操作联接表
我有两个通过联接表连接的模型:Ruby on rails Rails:以嵌套形式操作联接表,ruby-on-rails,nested-forms,jointable,Ruby On Rails,Nested Forms,Jointable,我有两个通过联接表连接的模型: class Publication < ActiveRecord::Base attr_accessible :title, :author_attributes, :translator_attributes has_many :publication_contributors has_many :authors, :through => :publication_contributors, :source => :contrib
class Publication < ActiveRecord::Base
attr_accessible :title, :author_attributes, :translator_attributes
has_many :publication_contributors
has_many :authors, :through => :publication_contributors, :source => :contributor,
:conditions => {:publication_contributors => {:contributor_type => "Author"}}
has_many :translators, :through => :publication_contributors, :source => :contributor,
:conditions => {:publication_contributors => {:contributor_type => "Translator"}}
accepts_nested_attributes_for :authors, :translators
end
class Contributor < ActiveRecord::Base
attr_accessible :name
has_many :publications, :through => :publication_contributors
has_many :publication_contributors
end
class PublicationContributor < ActiveRecord::Base
attr_accessible :contributor_type
belongs_to :publication
belongs_to :contributor
end
在我的控制器中:
def create
publication = Publication.create(params[:publication])
end
表单按预期呈现,但在创建操作期间会发出劈啪声。我曾希望Rails能够根据出版物关联中的条件神奇地分配适当的贡献者类型,例如:
has_many :authors, :through => :publication_contributors, :source => :contributor,
:conditions => {:publication_contributors => {:contributor_type => "Author"}}
不幸的是,事实并非如此。我在创建过程中遇到此错误:
Mysql2::Error: Column 'contributor_type' cannot be null
这让我觉得我唯一的办法是在创建回调之前在中手动分配contributor类型,但如果是这样,我如何确定要分配哪种类型?参数名称中的类型正确,例如:
publication[authors_attributes][0][name]
是否有某种方法可以访问模型层中的信息
更新:
我的新建操作:
def new
@publication = Publication.new
publication_contributor = @publication.publication_contributors.build
contributor = publication_contributor.contributor.build
end
它在最后一行抛出此错误(设置contributor
):
你能试试下面的吗
class Publication < ActiveRecord::Base
attr_accessible :title, :publication_contributors_attributes
has_many :publication_contributors
has_many :authors, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Author' } }
has_many :translators, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Translator' } }
accepts_nested_attributes_for :publication_contributors
end
class Contributor < ActiveRecord::Base
attr_accessible :name
has_many :publications, through: :publication_contributors
has_many :publication_contributors
end
class PublicationContributor < ActiveRecord::Base
attr_accessible :contributor_type
belongs_to :publication
belongs_to :contributor
accepts_nested_attributes_for :contributor
end
<%= form_for @publication, :remote => true do |f| %>
<%= f.label :title %>:
<%= f.text_field :title %>
<%= f.fields_for :publication_contributors do |pc_form| %>
<%= pc_form.hidden_field :contributor_type %>
<%= pc_form.fields_for :contributor do |c_form| %>
<%= c_form.label :name, "Author" %>:
<%= c_form.text_field :name %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
你能试着在表单上添加一个隐藏字段吗?我不确定这是否有帮助。contributor\u type
属性在联接表中,而不是在contributor模型中。因为我实际上并没有在表单中声明联接表,所以我无法访问它的属性,即使使用隐藏字段也是如此。但是,如果有一种方法可以在表单中创建联接表,那么这种方法可能会起作用。我会调查的。如果你还有其他建议,请告诉我。你是对的。如果你先看一下《贡献者》杂志,然后再看《贡献者》杂志,可以吗?我会给你一个机会,看看效果如何。我不确定这是否可能。为了让它工作,我必须在PublicationContributor之外创建一个Contributor实例,如下所示:publication\u Contributor.Contributor.new
。这会为nil:NilClass抛出一个未定义的方法“new”
错误。我使用.build
获得了相同的结果。我想知道ActiveRecord是否不支持从子级嵌套到父级。不要以任何方式提及这种情况。给了我这个机会,但我仍然得到构建错误。奇怪的是,类似的情况也适用于此。我已经更新了我的答案,告诉你控制器至少应该是什么样子:)当然!尽管我只创建了其中一个,但出版物贡献者仍然是一个协会。奇怪的是,我不能用publication\u contributors=@publication.publication\u contributors.build
设置它,然后用publication\u contributors.each
直接访问它。不过,您的代码工作得很好。谢谢!我无法直接访问出版物投稿人,这让我感到困惑。
undefined method `build' for nil:NilClass
class Publication < ActiveRecord::Base
attr_accessible :title, :publication_contributors_attributes
has_many :publication_contributors
has_many :authors, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Author' } }
has_many :translators, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Translator' } }
accepts_nested_attributes_for :publication_contributors
end
class Contributor < ActiveRecord::Base
attr_accessible :name
has_many :publications, through: :publication_contributors
has_many :publication_contributors
end
class PublicationContributor < ActiveRecord::Base
attr_accessible :contributor_type
belongs_to :publication
belongs_to :contributor
accepts_nested_attributes_for :contributor
end
<%= form_for @publication, :remote => true do |f| %>
<%= f.label :title %>:
<%= f.text_field :title %>
<%= f.fields_for :publication_contributors do |pc_form| %>
<%= pc_form.hidden_field :contributor_type %>
<%= pc_form.fields_for :contributor do |c_form| %>
<%= c_form.label :name, "Author" %>:
<%= c_form.text_field :name %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
@publication.publication_contributors.build
@publication.publication_contributors.each do |pc|
pc.build_contributor
end