Gor*_*McD 1 ruby closures ruby-on-rails block
我正在开发一个CRUD界面来管理我的应用程序中的用户.我有一个常量User :: ROLES,它是一个在我的应用程序(管理员,教师,学生)中具有有效用户角色名称的数组.
我想要做的是,在控制器的索引操作中,有一个循环遍历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
Run Code Online (Sandbox Code Playgroud)
所以我希望能够通过块传递的内容命名实例变量,所以@r创建@admin,@ teacher等等.因为我是ruby和rails的新手,所以我不太明白这样做的语法这个.谁知道?无论如何,这可能是更好的方法.
编辑
只是为了让每个人都知道,我希望在索引操作的视图中使用它来显示按角色分组的用户列表.当然,它也将在整个CRUD界面中以其他方式使用,这就是为什么我之前没有澄清用例,因为它是多用途的.
这可能是一个坏主意.如果更改模型中的角色,则需要相应地更新视图以使用其他实例方法.处理此问题的更好方法是简单地按用户角色对用户进行分组:
@users = User.group(:role).all
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个哈希,其中包含以您可以轻松用于构建动态视图的每个角色命名的键:
<% @users.each_pair do |role, users| %>
<h2><%= role.to_s.titlelize %></h2>
<% users.each do |user| %>
...
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
如果需要,您还可以访问具有特定角色的用户:
<h2>Admin users:</h2>
<%= @users[:admin].map(&:name).to_sentence %>
Run Code Online (Sandbox Code Playgroud)