我有一个带有以下内容的嵌套属性表单,我只是学习如何使用嵌套属性。我遇到的一个问题是child_index值没有递增。我根据控制器中的构建得到3个字段,但它们都有0或1,具体取决于设置的数字。
有关如何增加此功能的任何想法?
# in controller: 3.times {@item.assets.build}
<% number = 1 %>
<div id='files'>
<%= f.fields_for :assets, :child_index => number do |asset| %>
<p>
number:<%= number %><br />
<%=asset.label :asset, "File ##{number += 1}" %>
<%= asset.file_field :asset %>
</p>
<% end %>
</div>
<%= f.submit %>
编辑: 因此,html中的所有内容都具有以下形式:
item[assets_attributes][0][asset]
而非期望:
menu_item[assets_attributes][0][asset]
menu_item[assets_attributes][1][asset]
menu_item[assets_attributes][2][asset]
编辑#2: 所以通过源代码查看,我看到以下内容并且想知道rails是否应该进行一些自动交换,并且可能没有发生这种情况;
<input id="item_assets_attributes_0_asset" name="item[assets_attributes][0][asset]" type="file" />
<input id="item_assets_attributes_0_id" name="item[assets_attributes][0][id]" type="hidden" value="1" />
答案 0 :(得分:3)
查看Rails源代码,很明显,如果指定:child_index
,则不会自动增加。这是否是正确的行为是值得商榷的。如果在调用:child_index
时完全省略fields_for
,则应该获得所需的索引。
要为每个字段获取正确的标签,您可以使用一些JavaScript。如果您不喜欢,可以将文件编号设置为Asset
类的属性。
class Asset < AR
attr_accessor :file_number
end
# in controller: 3.times {|n| @item.assets.build(:file_number => n) }
<div id='files'>
<%= f.fields_for :assets do |asset| %>
<p>
<%=asset.label :asset, "File ##{asset.file_number}" %>
<%= asset.file_field :asset %>
</p>
<% end %>
</div>
<%= f.submit %>