ruby-on-rails - 使用 block 命名和创建实例变量 [Ruby-on-Rails]

标签 ruby-on-rails ruby closures block

我正在开发用于管理应用程序中用户的 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/

相关文章:

ruby-on-rails - 在 Jenkins CI 服务器上运行 Jasmine

javascript - 在 JavaScript 的 for 循环中调用异步函数

python - 创建一个函数的副本,并修复了一些变量

ruby-on-rails - Rails 4 从迁移索引中删除迁移 ID

ruby-on-rails - 导出rails数据库数据的最佳方式

ruby-on-rails - Rails 中的两列不能彼此相等

ruby - 如何确定Ruby中字符串的编码

ruby - 理性 - ruby 中的原始数字

ruby - 如何为逻辑编写 rspec 并编写 mock STDIN

javascript - jQuery 事件处理程序闭包与上下文