2011-10-04 16 views
4

我有一個嵌套的屬性形式與以下,我剛剛學習如何使用嵌套的屬性。我遇到的一個問題是child_index值沒有增加。根據控制器中的內部版本,我獲得了3個字段,但它們都取0或1,具體取決於設置的編號。Rails的3.1 - :fields_for,:child_index不遞增

有關如何讓它增加的任何想法?

# 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

了類似的問題,我不得不添加accepts_nested_attributes_for模型,看到https://github.com/rails/rails/blob/75366cb82dc6fa4b3dada2a450dda18496f3eddd/actionpack/lib/action_view/helpers/form_helper.rb#L1253 – poseid

回答

3

通過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 %>