1

我正在开发一个 CRUD 界面来管理我的应用程序中的用户。我有一个常量 User::ROLES ,它是一个数组,其中包含我的应用程序(管理员、教师、学生)中有效用户角色的名称。

我想要做的是,在控制器的索引操作中,有一个块迭代 ROLES 常量并从 @users 创建一个作用域实例变量(它已经在块之前初始化)。以下是 index 方法目前的样子:

def index
    @users = user.all
    #@students = @users.where(:role => "student") # This works by itself
    User::ROLES.each do |r|
        @r = @users.where(:role => r.to_s)
    end
end

所以我希望能够通过块传递的内容来命名实例变量,所以@r 创建了@admin、@teacher 等。由于我是 ruby​​ 和 rails 的新手,所以我不太了解这样做的语法这个。谁知道?无论如何,可能有更好的方法来做到这一点。

编辑

只是为了让大家知道,我希望在 index 操作的视图中使用它来显示按角色分组的用户列表。当然,它也会在整个 CRUD 界面中以其他方式使用,这就是为什么我没有在前面阐明用例的原因,因为它是多用途的。

4

1 回答 1

6

这可能是个坏主意。如果您更改模型中的角色,则需要相应地更新视图以使用不同的实例方法。处理此问题的更好方法是简单地按用户角色对用户进行分组:

@users = User.group(:role).all

这将为您提供一个带有以每个角色命名的键的散列,您可以轻松地使用这些键来构建动态视图:

<% @users.each_pair do |role, users| %>
  <h2><%= role.to_s.titlelize %></h2>
  <% users.each do |user| %>
    ...
  <% end %>
<% end %>

如果需要,您还可以访问具有特定角色的用户:

<h2>Admin users:</h2>
<%= @users[:admin].map(&:name).to_sentence %>
于 2012-04-27T21:36:33.840 回答