【问题标题】:Rails 3.1 - :fields_for, :child_index not incrementingRails 3.1 - :fields_for, :child_index 不递增
【发布时间】:2011-10-04 03:21:10
【问题描述】:

我有一个包含以下内容的嵌套属性表单,并且正在学习如何使用嵌套属性。我遇到的一个问题是 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" />

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

查看 Rails 源代码很明显,如果您指定 :child_index,则不会自动递增。这是否是正确的行为是有争议的。如果您在调用fields_for 时完全省略了:child_index,您应该会得到您想要的索引。

要为每个字段获取正确的标签,您可以使用一些 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 %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多