更新:根据堆栈跟踪,发布在此问题的最后,我认为真正的问题是要弄清楚attr_accessible和构建关联设置我需要让贡献者和链接器属性用新的isbn id进行更新。请帮帮我! ISBN和贡献者 - - 其中有一个多对多的关系nested_form,collection_select,accepting_attributes_for和fields_for,并将记录添加到连接表
我有两个模型之间的连接表继。我想在使用fields_for的嵌套窗体内的collection_select下拉列表中使用贡献者模型中的现有值。
因此,当我创建新的isbn时,我不想创建新的贡献者记录 - 我希望能够选择现有的记录。我希望能够选择许多贡献者,这就是为什么我使用nested_form gem这使我可以为贡献者动态创建额外的表单域。
我的问题:我应该在连接表上调用方法吗?如果是这样,为什么我得到一个 '丢失块' 的错误,尽管有几乎一切attr_accessible和accepts_nested_attributes_for:
isbn.rb:
attr_accessible :linkers_attributes, :contributors_attributes, :contributor_id,
has_many :linkers
has_many :contributors, :through => :linkers
accepts_nested_attributes_for :contributors
accepts_nested_attributes_for :linkers
contributor.rb:
attr_accessible :linkers_attributes, :isbns_attributes
has_many :linkers
has_many :isbns, :through => :linkers
accepts_nested_attributes_for :isbns
accepts_nested_attributes_for :linkers
连接.RB:
belongs_to :isbn
belongs_to :contributor
accepts_nested_attributes_for :contributor
accepts_nested_attributes_for :isbn
attr_accessible :isbn_id, :contributor_id, :isbns_attributes, :contributors_attributes, :contributor_attributes, :isbn_attributes
的ISBN控制器:
def new
@isbn = Isbn.new
@title = "Create new ISBN"
1.times {@isbn.linkers.build}
end
new.html.erb:
<td class="main">
<%= nested_form_for @isbn, :validate => false do |f| %>
<h1>Create new ISBN</h1>
<%= render 'shared/error_messages', :object => f.object %>
<%= render 'fields', :f => f %>
<div class="actions">
<%= f.submit "Create" %>
</div>
_fields:(选项1)
<%= f.fields_for :contributors do |contributor_form| %>
<li>
<%= contributor_form.label 'Contributor Name' %>
<%= contributor_form.collection_select(:isbn_id, Contributor.all, :id, :personnameinverted) %>
</li>
<%= contributor_form.link_to_remove "[-] Remove this contributor"%>
<% end %>
<%= f.link_to_add "[+] Add a contributor", :contributors %>
这将创建一个新的书号,并在接头用正确的isbn_id的新纪录,但也是贡献者中的新记录,当我真的希望新的链接器记录包含现有的contributor_id时。所以,我想我会做到这一点:
_fields(选项2)
<%= field_set_tag 'Contributor' do %>
<li>
<%= f.label 'Contributor Sequence Number' %>
<%= f.text_field :descriptivedetail_contributor_sequencenumber%>
<%= tooltip(:xxx, :hover) %>
</li>
<%= f.fields_for :linkers do |contributor_form| %>
<li>
<%= contributor_form.label 'Contributor Name' %>
<%= contributor_form.collection_select(:isbn_id, Contributor.all, :id, :personnameinverted) %>
</li>
<%= contributor_form.link_to_remove "[-] Remove this contributor"%>
<% end %>
<%= f.link_to_add "[+] Add a contributor", :contributors %>
但这返回一个丢失块错误。
巨大的感谢提前,我花了两个坚实的日子,并认为我可能会弹出。
更新:这里有一个线索,从这个新的代码的堆栈跟踪,因为我想你不能真正称之为基于连接表的方法:
<%= f.fields_for :contributors do |contributor_form| %>
<li>
<%= contributor_form.collection_select(:id, Contributor.all, :id, :personnameinverted, :include_blank => true) %>
Started POST "/isbns" for 127.0.0.1 at 2011-06-08 20:12:48 +0100
Processing by IsbnsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"u0TszLESOnZlr4iEiBlVg6w9B5T+EH0dxJg/0E6PKuQ=", "isbn"=>{"descriptivedetail_titledetail_titleelement_titleprefix"=>"", "descriptivedetail_titledetail_titleelement_titlewithoutprefix"=>"qqq", "istc_id"=>"471", "descriptivedetail_contributor_sequencenumber"=>"", "contributors_attributes"=>{"0"=>{"id"=>"1", "_destroy"=>"false"}, "1307560328932"=>{"id"=>"14", "_destroy"=>"false"}}, "descriptivedetail_contributor_contributorrole"=>""}, "commit"=>"Create"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
Contributor Load (0.3ms) SELECT "contributors".* FROM "contributors" INNER JOIN "linkers" ON "contributors".id = "linkers".contributor_id WHERE "contributors"."id" IN (1, 14) AND (("linkers".isbn_id = NULL))
Completed in 308ms
所以它看起来像贡献者标识实际上是被设置,但链接器表没有被传递isbn id。起...