#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 %>