Rails按字母顺序显示表格

时间:2013-05-15 01:11:05

标签: ruby-on-rails

我想按字母顺序显示整个用户表,我知道这需要在控制器中完成: 我在控制器中使用的代码:

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

我错过了什么?谢谢。

4 个答案:

答案 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)