gpt4 book ai didi

ruby-on-rails - nested_form、collection_select、accepts_nested_attributes_for 和 fields_for,以及将记录添加到连接表

转载 作者:行者123 更新时间:2023-12-04 06:23:37 25 4
gpt4 key购买 nike

更新:根据在此问题末尾发布的堆栈跟踪,我认为真正的问题是弄清楚我需要什么 attr_accessible 和构建关联设置来获取贡献者和链接器属性以使用新的 isbn id 进行更新。请帮我!

this question...

我有两个模型之间的连接表 - isbns 和贡献者 - 它们具有多对多的关系。我想在使用 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

贡献者.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

isbns Controller :
def new
@isbn = Isbn.new
@title = "Create new ISBN"
1.times {@isbn.linkers.build}
end

新的.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,并在具有正确 isbn_id 的链接器中创建一个新记录,但在贡献者中也会创建一个新记录,当我实际上希望新链接器记录包含现有的贡献者_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

所以看起来贡献者ID实际上正在设置,但链接器表没有被传递isbn id。向前...

最佳答案

好。这是我如何做到的。

安装茧 gem 。
最后也开始安装 Haml,

我拆分了 new 和 update 操作,因此新表单只是获取 id 集的快捷方式,只有最少的字段。然后用户可以编辑它,并添加贡献者。从用户的角度来看,这实际上并不坏,因为他们可以快速创建一个 isbn,而无需填写无数个字段。

isbns/new.html.haml

%td.main
= semantic_form_for @isbn do |f|
%h1 Create new ISBN
= render 'shared/error_messages', :object => f.object
= render 'fields', :f => f
%div#actions
= f.submit "Create"

isbns/_fields.html.haml
- f.inputs do
= f.input :istc_id, :as => :select, :collection => Istc.all
= f.input :descriptivedetail_titledetail_titleelement_titlewithoutprefix
%h3 Contributors
#tasks
= f.semantic_fields_for :linkers do |linker|
= render 'linker_fields', :f => linker
.links
= link_to_add_association 'add contributor', f, :linkers
-f.buttons do
= f.submit 'Save'

isbns/_linker_fields.html.haml
.nested-fields
= f.inputs do
= f.input :contributor_id, :label_method => :keynames, :as => :select, :collection => Contributor.all
= link_to_remove_association "remove contributor", f

书目
  has_many :linkers
has_many :contributors, :through => :linkers
accepts_nested_attributes_for :contributors, :allow_destroy => true
accepts_nested_attributes_for :linkers, :allow_destroy => true

贡献者.rb
  attr_accessible :linkers_attributes, :isbns_attributes
has_many :isbns, :through => :linkers
has_many :linkers
accepts_nested_attributes_for :linkers

链接器
belongs_to :contributor
belongs_to :isbn
accepts_nested_attributes_for :contributor

结果是
Started POST "/isbns/58" for 127.0.0.1 at 2011-06-09 12:34:14 +0100
Processing by IsbnsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"u0TszLESOnZlr4iEiBlVg6w9B5T+EH0dxJg/0E6PKuQ=", "isbn"=>{"istc_id"=>"360", "descriptivedetail_titledetail_titleelement_titlewithoutprefix"=>"thurs title", "linkers_attributes"=>{"0"=>{"contributor_id"=>"3", "_destroy"=>"", "id"=>"68"}, "1"=>{"contributor_id"=>"71", "_destroy"=>"", "id"=>"69"}, "2"=>{"contributor_id"=>"72", "_destroy"=>"", "id"=>"70"}, "3"=>{"contributor_id"=>"3", "_destroy"=>"", "id"=>"71"}}}, "commit"=>"Save", "id"=>"58"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
Isbn Load (8.2ms) SELECT "isbns".* FROM "isbns" WHERE "isbns"."id" = 58 ORDER BY descriptivedetail_titledetail_titleelement_titlewithoutprefix LIMIT 1
Linker Load (0.3ms) SELECT "linkers".* FROM "linkers" WHERE "linkers"."id" IN (68, 69, 70, 71) AND ("linkers".isbn_id = 58)
AREL (0.4ms) UPDATE "linkers" SET "contributor_id" = 3, "updated_at" = '2011-06-09 11:34:14.509943' WHERE "linkers"."id" = 71
Contributor Load (158.3ms) SELECT "contributors".* FROM "contributors"
Redirected to http://localhost:3000/isbns/58
Completed 302 Found in 545ms

换句话说,从使用 formtastic 动态生成嵌套 fields_for 的 isbn 编辑表单,我可以使用下拉菜单选择与 isbns 具有多对多关系的现有贡献者。

呼。

关于ruby-on-rails - nested_form、collection_select、accepts_nested_attributes_for 和 fields_for,以及将记录添加到连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6282951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com