2011-02-10 90 views
28

我正在使用Rails 3.0.3和ruby 1.9.2p0。Rails 3 fields_for - 排序順序會丟失

在我profiles_controller(編輯功能)我有這個調用

@profile = Profile.find(params[:id]) 
@profile_items = @profile.profile_items.order("pos") 

得到@profile_items以正確的順序,排序上的 「POS」。 在_form.html.erb我有以下

<% @profile_items.each do |pi| %> 
    <%= pi.pos %> | 
<% end %> 
<%= f.fields_for :profile_items do |f2| %> 
    <%= render 'profile_item_fields', :f => f2 %> 
<% end %> 

3個第一行是測試代碼來表明該@profile_items是正確的順序。 但是,當他們被渲染,他們已經失去了排序順序!

現在我已經搜索了很多答案,我認爲這一定是一個常見的「陷阱」 陷入。

感謝任何幫助......

回答

42

據爲fields_for Rails的文檔,你還可以指定記錄名稱後的記錄對象。

所以這樣的事情應該工作...

<%= f.fields_for :profile_items, @profile_items do |f2| %> 
    <%= render 'profile_item_fields', :f => f2 %> 
<% end %> 
+20

小修改。如果你想保持記錄排序,不要在關聯中進行記錄。它會從數據庫中提取東西,並吹走你的臨時條目(比如那些沒有被保存的錯誤)。因此,而不是`@ profile_items.order('position')`做這樣的事情:`@ profile_items.sort_by(&:position)`。 – Grocery 2012-12-10 21:38:27

+1

比使用默認範圍要好很多很多很多。 – 2015-09-03 11:16:25

17

這可以用在嵌套模型default_scope來完成:

class YourModel < ActiveRecord::Base 
    belongs_to :other_model 
    default_scope { order(:name) } 
end