rails嵌套表单为生成的字段分配唯一ID

时间:2013-04-03 08:07:16

标签: ruby-on-rails nested-forms

我想为嵌套表单生成的每一行分配唯一ID。

我看了这个问题Creating unique id for <fieldset> when using form_for Rails Nested Model Form,但这并没有解决我的问题。

2 个答案:

答案 0 :(得分:3)

我设法通过查看嵌套的表单gem解决了这个问题。 内嵌嵌套gem唯一ID是为每次添加动态生成的。 解析数据蓝图,并用生成的唯一ID替换“new _#{association}”。在我的情况下,关系就像'目录'has_many'类别',所以我的关联是类别。 我为id =“new_categories”指定了新行,并在添加新行时将其替换为唯一ID。

也许它对其他人有用。

答案 1 :(得分:2)

实际上,Anil Maurya给出的解决方案仅适用于使用gem提供的link_to_add通过javascript动态添加的项目。但对我来说,它会为现有项目留下new_association

为了正确识别每个嵌套元素(即使是深度嵌套的元素),也可以使用f.index。优点是,如果条目已经存在(意味着,如果它在数据库中),那么它将被它在数组中的索引替换。但是,使用link_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>

另外需要注意的是,如果每个嵌套的字段集都被带有&#34;字段&#34;

类的标记包装,那么gem nested_form将只能正常工作。