如何通过 will_paginate 在视图和控制器上使用 sort_by 或 order_by?

tri*_*ddy 3 sorting pagination ruby-on-rails

在我的 Rails 应用程序中,我通过分页限制页面上显示的房间数量,我希望允许用户将结果排序/排序到房间模型的不同列。我想我需要一个下拉菜单来执行此操作,然后可能通过实例变量将此数据传递到我的 rooms_controller 。

如何根据列对带有 select 标签的房间进行排序?我需要在相应的控制器中做什么才能完成这项工作?

目前我正在使用它作为下拉菜单:

索引.html.erb

...
...
<%= will_paginate @rooms %>

<div id="order-by">
     <select>
        <option value="asc">Distance</option>
        <option value="asc">Name</option>
        <option value="asc">Price (low to high)</option>
        <option value="des">Price (high to low)</option>
        <option value="asc">Reviews</option>
      </select>
</div>
Run Code Online (Sandbox Code Playgroud)

rooms_controller.rb

...
...
  def index
    @rooms = Room.paginate :page => params[:page], :per_page => 12
  end
...
Run Code Online (Sandbox Code Playgroud)

我的房间模型有listing_name:string、address:string、nightly_price:integer 和has_many 评论。我的评论模型属于房间。我正在使用地理编码器 gem 来定位房间的位置。

我已经搜索了分配并尝试了多种方法来完成这项工作,但我无法弄清楚这一点。对于任何有关如何解决此问题的提示,我会非常高兴!如果您需要更多信息,请告诉我。

Ale*_*nts 5

就像是:

索引.html.erb

<%= will_paginate @rooms %>

<div id="order-by">
  <form>
    <select name="sort">
      <option value="distance">Distance</option>
      <option value="name">Name</option>
      <option value="price">Price (low to high)</option>
      <option value="price desc">Price (high to low)</option>
      <option value="review">Reviews</option>
    </select>

    <input type="submit" value="Sort"/>
  </form>
</div>
Run Code Online (Sandbox Code Playgroud)

rooms_controller.rb

def index
  @rooms = Room.order(params[:sort]).paginate(page: params[:page], per_page: 12)
end
Run Code Online (Sandbox Code Playgroud)

还需要确保params[:sort]仅包含在可用值中,例如:

 sort = params[:sort]
 sort = nil unless sort.in?(['distance', 'name', 'price', 'price desc', 'review'])
 @rooms = Room.order(sort).paginate(page: params[:page], per_page: 12)
Run Code Online (Sandbox Code Playgroud)

考虑使用单独的范围进行排序或使用一些 gem。例如洗劫