我有一个使用Devise的用户模型,我已经设置了角色,因此可以为用户分配一个或多个角色。如果我想在视图中查看用户的角色,则以下代码可以正常运行...
<% if current_user.roles.include? Role.find_by_name('Administrator') %>
You are an administrator!
<% end %>
但现在,假设我想检查用户是否具有多个角色中的一个,以查看他们是管理员还是编辑。我确信以下内容可行......
<% if current_user.roles.include? Role.find_by_name('Administrator' || 'Editor') %>
...但它没有,只有当你是管理员并忽略在该列表中的第一个之后检查所有其他角色时,它才有效。我尝试过其他组合,比如Role.find_by_name(['管理员','编辑'])等等,但没有成功。究竟如何格式化以完成多个角色的检查?我一直在谷歌搜索,但所有的例子都只使用一个角色。
答案 0 :(得分:5)
第一个问题是当您使用语法'Administrator'||时'编辑'它不会创建一个sql OR语法。相反,Ruby会评估“Administrator”被视为TRUE值并将其传递给find_by_name方法。编辑永远不会发送。
第二个问题是,即使您将语法更改为['Administrator','Editor'],find_by_name方法也始终只返回一条记录。
所以我可能会这样做:
Role.where(:name => ['Administrator', 'Editor']).all
这将返回这两个角色。
我进一步想到了这一点,因为在视图中放置这种数据库逻辑并不是一种真正的最佳实践解决方案。这是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') %>
答案 1 :(得分:0)
你应该看看cancan:http://railscasts.com/episodes/192-authorization-with-cancan它可以帮助你将授权规则保存在一个地方,而不是通过你的视图和控制器传播它。
答案 2 :(得分:0)
设计3及以上使用current_user.has_any_role?(:Administrator, :Editor)
以下是检查可以使用的角色的所有设计方法;
current_user.has_role?(role_name, resource = nil)
current_user.has_all_roles?(*args)
current_user.only_has_role?(role_name, resource = nil)
current_user.has_any_role?(*args)