Rails 3 fields_for - 排序顺序丢失

Mic*_*röm 32 sorting fields-for ruby-on-rails-3

我正在使用Rails 3.0.3和ruby 1.9.2p0.

在我的profiles_controller(编辑功能)中,我有这个电话

@profile = Profile.find(params[:id])
@profile_items = @profile.profile_items.order("pos")
Run Code Online (Sandbox Code Playgroud)

以正确的顺序获取@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 %>
Run Code Online (Sandbox Code Playgroud)

第3行是测试代码,用于显示@profile_items的顺序正确.但是当它们被渲染时,它们已经丢失了排序顺序!

现在我已经搜索了很多答案,我认为这必须是一个常见的"陷阱".

感谢任何帮助......

Ter*_*ler 46

根据fields_for的Rails文档,您还可以在记录名称后指定记录对象.

所以这样的事情应该有效......

<%= f.fields_for :profile_items, @profile_items do |f2| %>
  <%= render 'profile_item_fields', :f => f2 %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

  • 小修正案.如果要保持记录的排序,请不要在关联上进行.它将从数据库中获取内容并清除您的临时条目(例如那些没有保存的错误).因此,而不是`@ profile_items.order('position')`做这样的事情:`@ profile_items.sort_by(&:position)`. (22认同)

Ben*_*Ben 22

这可以通过嵌套模型上的default_scope来完成:

class YourModel < ActiveRecord::Base
  belongs_to :other_model
  default_scope { order(:name) }
end
Run Code Online (Sandbox Code Playgroud)