我想按字母顺序显示整个用户表,我知道这需要在控制器中完成: 我在控制器中使用的代码:
class UsersController < ApplicationController
@users = User.find(:all)
@users.sort! { |a,b| a.name.downcase <=> b.name.downcase }
...
end
表单代码:
<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
</tr>
<% end %>
收到错误未定义方法`downcase'为nil:NilClass
我错过了什么?谢谢。
答案 0 :(得分:1)
您应该在查询中添加一个订单子句。
@users = User.reorder(:name)
我不确定你的目的是什么,但是如果你有大量的用户,你应该为此添加一个限制或分页。
答案 1 :(得分:1)
您有一个没有名字的用户,这就是您收到该错误的原因。 你可以用
来避免这个错误@users.sort! { |a,b| a.name.try(:downcase) <=> b.name.try(:downcase) }
但这是一个丑陋的解决方案,正确的方法就是直接在查询
上进行User.order("name")
答案 2 :(得分:0)
实际上我认为这应该属于模型,我相信这将使您的控制器代码更具可读性。
并且具有范围将使您的条件链能够,请阅读有关scope
的更多信息假设你有rails 3.x
#users model
class User < ActiveRecord::Base
scope :asc_by_name, lambda {
{:order => 'name ASC'}
}
end
#users controller
@users = User.asc_by_name
并在循环使用中,
<% @users.each do |user| %>
<tr>
<td><%= user.try(:name) %></td>
</tr>
<% end %>
答案 3 :(得分:0)
您的数据库引擎通常更适合排序,因此我会在查询中进行排序:
@user = User.order(:name)
将为您提供按User
列排序的所有name
个对象。这也是一样的:
@user = User.find(:all, order: :name)