我正在开发用于管理应用程序中用户的 CRUD 界面。我有一个常量 User::ROLES,它是一个数组,其中包含我的应用程序中有效用户角色的名称(管理员、教师、学生)。
我想要做的是,在 Controller 的索引操作中,有一个 block 迭代 ROLES 常量并从 @users 创建一个作用域实例变量(它已经在 block 之前初始化)。到目前为止,索引方法是这样的:
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
所以我希望能够通过 block 中传递的内容来命名实例变量,所以@r 创建了@admin、@teacher 等。由于我是 ruby 和 rails 的新手,所以我不太了解这样做的语法。谁知道?无论如何,可能有更好的方法。
编辑
只是想让大家知道,我希望在索引操作的 View 中使用它来显示按角色分组的用户列表。当然,它也会在整个 CRUD 界面中以其他方式使用,这就是为什么我之前没有阐明用例的原因,因为它是多用途的。
最佳答案
这可能是个坏主意。如果您更改模型中的角色,则需要相应地更新 View 以使用不同的实例方法。处理此问题的更好方法是简单地按角色对用户进行分组:
@users = User.group(:role).all
这将为您提供一个散列,其中包含以每个角色命名的键,您可以轻松地使用它来构建动态 View :
<% @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 %>
关于ruby-on-rails - 使用 block 命名和创建实例变量 [Ruby-on-Rails],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10358101/