2012-04-27 86 views
1

我正在使用CRUD界面来管理我的应用程序中的用户。我有一个常数User :: ROLES,它是一个在我的应用程序中具有有效用户角色名称的数组(管理员,教师,学生)。使用块命名和创建实例变量[Ruby-on-Rails]

我想要做的是,在控制器的索引操作中,有一个块遍历ROLES常量,并从@users(已经在块之前初始化)创建一个范围实例变量。下面是该指数方法貌似至今:

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等。由于我新的红宝石和铁轨,我不太明白这样做的语法。谁知道?反正可能有更好的方法。

编辑

只是为了让大家知道,我希望在视图中使用的索引操作显示由自己的角色进行分组的用户列表。当然,在整个CRUD界面中它也会以其他方式使用,这就是为什么我之前没有澄清用例,因为它是多用途的。

回答

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

“如果你在你的模型中改变一个角色,你将需要更新您的视图中使用不同的实例方法”。现在你自相矛盾。如果您通过“@users [:admin]”访问特定角色,则必须以完全相同的方式调整视图,方法是更改​​角色名称。 – 2012-04-27 21:51:23

+0

谢谢。我不知道组方法和each_pair。这有很大帮助。 – GorrillaMcD 2012-04-27 22:21:58

+0

嗯,我不知道为什么,但组方法不起作用。它像正常一样返回用户记录,无需分组。我最终做了@users = User.all.group_by(&:role)',然后按预期工作。 – GorrillaMcD 2012-05-07 22:53:01