Rails 3/Devise:检查用户是否具有多个角色

Sha*_*non 2 ruby roles ruby-on-rails devise

我有一个使用Devise的用户模型,我已经设置了角色,因此可以为用户分配一个或多个角色.如果我想在视图中查看用户的角色,则以下代码可以正常运行...

<% if current_user.roles.include? Role.find_by_name('Administrator') %>
     You are an administrator!
<% end %>
Run Code Online (Sandbox Code Playgroud)

但现在,假设我想检查用户是否具有多个角色之一,以查看他们是管理员还是编辑.我确信以下内容会起作用....

<% if current_user.roles.include? Role.find_by_name('Administrator' || 'Editor') %>
Run Code Online (Sandbox Code Playgroud)

...但它没有,只有当你是管理员并忽略在该列表中的第一个之后检查所有其他角色时它才有效.我尝试过其他组合,比如Role.find_by_name(['管理员','编辑'])等等,但没有成功.究竟如何格式化以完成多个角色的检查?我已经在谷歌各地寻找,但所有的例子都使用了一个角色.

Dan*_*nne 5

第一个问题是当您使用语法'Administrator'||时 '编辑'它不会创建一个sql OR语法.相反,Ruby会评估"Administrator"被视为TRUE值并将其传递给find_by_name方法.编辑永远不会发送.

第二个问题是即使您将语法更改为['Administrator','Editor'],find_by_name方法也始终只返回一条记录.

所以我可能会这样做:

Role.where(:name => ['Administrator', 'Editor']).all
Run Code Online (Sandbox Code Playgroud)

这将返回这两个角色.

编辑

我还想到了一点,因为在视图中放置这种数据库逻辑并不是最佳实践解决方案.这是MVC概念的另一种方式:

class User < ActiveRecord::Base
  ...

  def has_role?(*role_names)
    self.roles.where(:name => role_names).present?
  end
end

# In the views
<% if current_user.has_role?('Administrator', 'Editor') %>
Run Code Online (Sandbox Code Playgroud)