在'index'方法中,我总是列出对象。为此处理排序的最佳做法是什么?所以在视图中我想要一个下拉菜单,让我选择[Created At,Size,Price,...]。一个例子将非常感激。
答案 0 :(得分:0)
假设我有一个Book
模型,我想获取一些按特定字段排序的书籍。为了快速完成这项工作,我将创建一个方法,比如fetch_books
,它将采用options
哈希值。此哈希将保存用户想要对返回的书籍列表进行排序的参数。
在您的模型中,您可以拥有,
class Book < ActiveRecord::Base
def self.fetch_books(options)
find(:all, :order => options[:sort_by])
end
end
在你的控制器中,
class BooksController < ApplicationController
@books = Book.fetch_books(params)
end
答案 1 :(得分:0)
我认为这更像是一个可用性最佳实践问题。
答案实际上取决于信息的显示方式。还有它有多少。
如果用户可以排序的所有信息都以表格形式显示在页面上,那么我将使用link_to_remote仅更新具有新排序的表。
如果您的列表足够长,可以按不同的标准排序,那么您可能会进行某种分页。所以这个例子使用了paginate。
控制器
def index
order = params[:order]
find_options = {:per_page => params[:per_page] || 20,
:page => params[:per_page] || 1),
:order => order
}
@things = Things.paginate(find_options)
respond_to do |format|
format.html # default action
# update only the table partial if action is a java script request.
format.js render :update do |page|
page.replace_html :things_table_body, :partial => things, :collection => @things
end
end
end
没有偏见就没有意义。
查看:
...
<table>
<tr div="table_header">
<th>
<%= link_to_remote "Name", things_url(:order => :name), :href => things_url(:order => :name)%>
</th>
<th>
<%= link_to_remote "Created At", things_url(:order => :name), :href => things_url(:order => :name)%>
</th>
</tr>
<tbody div="things_table_body">
<%= render :partial => :thing, :collection => @things} %>
</table>
<%= will_paginate @things %>
...
如果您的用户未启用JavaScript,则link_to_remote的href选项允许回退到html请求。
事情偏:<tr>
<td>
<%=thing.name%>
</td>
<td>
<%=thing.created_at%>
</td>
</tr>
它留给读者练习如何在升序和降序排序之间切换。
如果您没有列出所有可排序的属性。选择框很好。我个人会选择单选按钮,如果排序方式列表不是太长。无论哪种方式,控制器代码看起来几乎与我之前发布的相同。