【问题标题】:Rails 3 fields_for - sort order gets lostRails 3 fields_for - 排序顺序丢失
【发布时间】:2011-02-10 19:45:40
【问题描述】:

我正在使用带有 ruby​​ 1.9.2p0 的 Rails 3.0.3。

在我的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 的顺序正确。 但是当它们被渲染时,它们已经失去了排序顺序!

现在我已经搜索了很多答案,我认为这一定是一个常见的“陷阱” 掉进。

感谢您的帮助...

【问题讨论】:

    标签: ruby-on-rails-3 sorting fields-for


    【解决方案1】:

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

    所以这样的事情应该可以工作......

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

    【讨论】:

    • 小修正。如果您想保持记录排序,请不要在关联上执行此操作。它将从数据库中获取内容并清除您的临时条目(例如那些没有保存的错误)。所以代替@profile_items.order('position') 做这样的事情:@profile_items.sort_by(&amp;:position)
    • 比使用默认范围好很多很多很多很多很多很多。
    • ... 同意 Grocery 在这个问题上的看法——但字段是基于“接受嵌套属性”的隐含的——所以没有定义过 @profile_items(使用这个例子)。那么如何对隐式生成的集合进行排序呢?我在这里找到了答案:stackoverflow.com/questions/10505853/…
    • @Grocery 谢谢!那些丢失的错误消息让我头疼!
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。我失去了继续下去的意愿
    • 这是我见过的最好的答案。
    • 如果您总是希望以相同的方式对此类进行排序,这是一个很好的解决方案。如果您最终希望以其他方式订购它,这会使事情变得非常复杂(您必须每次都退出默认范围)并且使用手动订购或多个命名范围更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2012-04-19
    • 2018-11-16
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多