gpt4 book ai didi

ruby-on-rails-3 - 如何使用 fields_for "parents[]"获取正确的子 ID,父 ID 为 |f|使用 f.fields_for :children, child ?

转载 作者:行者123 更新时间:2023-12-04 07:14:42 26 4
gpt4 key购买 nike

我正在以一种形式在索引 View 中编辑父模型的多个实例,如 Railscasts #198 中所示。每个父节点 has_many :children 和 Accepts_nested_attributes_for :children,如 Railscasts #196 和 #197 中所示

<%= form_tag %>
<% for parent in @parents %>
<%= fields_for "parents[]", parent do |f|
<%= f.text_field :job %>
<%= f.fields_for :children do |cf| %>
<% cf.text_field :chore %>
<% end %>
<% end %>
<% end %>
<% end %>

给定parent.id==1
f.text_field :job正确生成

<input id="parents_1_job" type="text" value="coding" size="30" name="parents[1][job]">  

但是 cf.text_field :chore 生成没有父索引的 id 和名称。

id="parents_children_attributes_0_chore"  
name="parents[children_attributes][0][chore]"

如果我尝试将特定的子对象传递给 f.fields_for,如下所示:

<% for child in parent.children %>
<%= f.fields_for :children, child do |cf| %>
<%= cf.text_field :chore %>
<% end %>
<% end %>

我也得到同样的结果。如果我将方法从 :children 更改为 "[]children"我得到

id="parents_1___children_chore"

它获取正确的parent_index,但不为子索引提供数组槽。

“[]children[]”也不正确: id="parents_1__children_3_chore"

因为我期待的是 attribute_0_chore 而不是 3_chore。

我是否需要直接修改 FormBuilder 对象的属性或子类 FormBuilder 才能实现此功能,或者是否有适合这种情况的语法?

感谢您的任何想法。

最佳答案

我确实通过阅读 FormBuilder.fields_for 的源代码解决了这个问题

一个可能的答案:是的,修改 FormBuilder 对象的 f.object_name 属性。

特别是在这种情况下

f.fields_for :children  

要打电话

f.fields_for_with_nested_attributes

根据f.object_name设置name变量。生成的元素的 id 看起来像是基于名称,因此两者在生成的 html 中匹配。

def fields_for_with_nested_attributes(association_name, args, block)
name = "#{object_name}[#{association_name}_attributes]"
.....

因此,告诉 f.fields_for 执行我想要的操作的一种方法是设置 f.object_name 以在 f.fields_for block 的持续时间内包含父 ID

<% old_object_name = f.object_name %>
<% f.object_name="parents[#{f.object.id}]" %>
<% =f.fields_for :children do |cf| %>
<%= cf.text_field :chore %>
<% end %>
<% f.object_name=old_object_name #should be "parents[]" %>

然后 f.fields_for block 中的所有内容都可以使用未经修改的标准 Rails 助手。

关于ruby-on-rails-3 - 如何使用 fields_for "parents[]"获取正确的子 ID,父 ID 为 |f|使用 f.fields_for :children, child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6474877/

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