Rails 3.1 — :fields_for, :child_index не увеличивается

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

У меня есть форма вложенных атрибутов со следующим, и я только учусь использовать вложенные атрибуты. Одна из проблем, с которой я сталкиваюсь, заключается в том, что значения 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" />
  

Комментарии:

1. для аналогичной проблемы мне пришлось добавить accepts_nested_attributes_for в модель, см. github.com/rails/rails/blob /…

Ответ №1:

Просматривая исходный код 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 %>