0

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

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 %>

收到 nil:NilClass 的错误undefined method `downcase'

我错过了什么?谢谢你。

4

4 回答 4

1

你有一个没有名字的用户,这就是你得到这个错误的原因。你可以避免这个错误

@users.sort! { |a,b| a.name.try(:downcase) <=> b.name.try(:downcase) }

但这是一个丑陋的解决方案,正确的方法是直接在查询上这样做

User.order("name")
于 2013-05-15T01:25:10.110 回答
1

您应该在查询中添加一个 order 子句。

@users = User.reorder(:name)

我不确定您要做什么,但如果您有大量用户,您可能应该为此添加限制或分页。

于 2013-05-15T01:14:12.907 回答
0

实际上我认为这应该属于模型,我相信这将使您的控制器代码更具可读性。

并且拥有范围将使您的条件链能够,阅读有关范围的更多信息

假设你有 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 %>
于 2013-05-15T01:29:54.423 回答
0

您的数据库引擎通常更适合排序,因此我将在查询中进行排序:

@user = User.order(:name)

将为您提供按列User排序的所有对象name。这也将起作用:

@user = User.find(:all, order: :name)
于 2013-05-16T19:39:03.120 回答