我想为嵌套表单生成的每一行分配唯一的 ID。
我查看了这个问题Creating unique id for <fieldset> when using form_for Rails Nested Model Form但这并不能解决我的问题。
我想为嵌套表单生成的每一行分配唯一的 ID。
我查看了这个问题Creating unique id for <fieldset> when using form_for Rails Nested Model Form但这并不能解决我的问题。
我设法通过查看嵌套形式 gem 解决了这个问题。为每个添加动态生成嵌套的 gem 内部唯一 ID。解析数据蓝图,并用生成的唯一 ID 替换“new_#{association}”。在我的情况下,关系就像“目录”has_many“类别”,所以我的关联是类别。我用 id = "new_categories" 分配了新行,并在添加新行时将其替换为唯一 ID。
也许它对其他人有用。
实际上,Anil Maurya 提供的解决方案仅适用于通过 javascript 使用link_to_add
gem 提供的动态添加的项目。但对我来说,它会留给new_association
已经存在的项目。
为了正确识别每个嵌套元素(甚至是深度嵌套的元素),可以使用f.index
. 优点是如果条目已经存在(意思是,如果它在数据库中),那么它将被它在数组中的索引替换。但是,usinglink_to_add
将替换f.index
为由 nested_form 自动生成的 ID,就像 Anil Maurya 的解决方案一样。
对于深度嵌套的解决方案,不是每次都编写fields_for
和使用相同的变量f
,如果您需要正确标记您的元素,您应该指定要渲染的部分,并且每次使用不同的f
变量,您应该将其传递给部分
例如:如果你有
Main has_many :nested1s
Nested1 has_many :nested2s
Nested2 has_many :nested3s
然后你的代码应该是这样的(我举了一个表格的例子,因为它更难):
<%= nested_form_for @Main do |main_form| %>
<table>
<thead>
<stuff />
</thead>
<%= main_form.fields_for :nested1s, :wrapper => false do |nested1_f| %>
<%= render 'main/nested1_fields', nested1_f: nested1_f %>
<% end %>
_nested1_fields.html.erb
<tbody class="fields">
<tr>Stuff</tr>
<tr>
<table id="nested1-<%= nested1_f.index %>-nested2s">
<thead>Stuff</thead>
<%= nested1_f.fields_for :nested2s, :wrapper => false do |nested2_f| %>
<%= render 'main/nested2_fields', nested1_f: nested1_f, nested2_f: nested2_f %>
<% end %>
</table>
</tr>
<tr><%= nested1_f.link_to_add 'add nested2', :nested2, :data => { :target => "#nested1-#{nested1_f.index}-nested2s"}, class: "btn btn-sm btn-success" %>
</tbody>
_nested2_fields.html.erb
<tbody class="fields">
...
<table id="nested1-<%= nested1_f.index %>-nested2-<%= nested2_f.index %>-nested3s">
<%= fields_for :nested3s do |nested3_f| %>
...
...
</tbody>
同样重要的是要注意 gemnested_form 只有在每个嵌套的字段集都由带有“字段”类的标签包装时才能正常工作