【问题标题】:Rails 3 / Devise: Checking to see if users have any of multiple rolesRails 3 / Devise:检查用户是否具有多个角色中的任何一个
【发布时间】:2011-07-24 03:33:10
【问题描述】:

我有一个使用 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(['Administrator','Editor']) 之类的,但没有成功。我将如何格式化它以完成对多个角色的检查?我在 Google 上搜索过,但所有示例都使用一个角色。

【问题讨论】:

    标签: ruby-on-rails ruby devise roles


    【解决方案1】:

    使用 devise 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)
    

    【讨论】:

      【解决方案2】:

      你应该看看cancan:http://railscasts.com/episodes/192-authorization-with-cancan它将帮助你将授权规则保存在一个地方,而不是通过你的视图和控制器传播它。

      【讨论】:

      • 我已经在我的应用程序中集成并运行了 Cancan。但是在这种特殊情况下,我需要在单个表单字段上定义权限,而不是整个模型。
      【解决方案3】:

      第一个问题是当你使用语法'Administrator' || 'Editor' 它不会创建 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') %>
      

      【讨论】:

      • 这很有道理,而且内容丰富,谢谢。但是,上述内容并没有立即起作用(奇怪的是,对于任何角色都返回了 true),但是通过一些修补,我能够通过将其修改为 ['Administrator ','编辑器']).现在? %>
      • 很高兴听到它成功了。我还想到了另一种方法。我编辑了我的答案以显示它。
      • 酷。我知道在视图中这不是一个好的做法,只是试图让一些东西现在工作,以后再重构。感谢您的提示。
      • 在这里使用应用程序助手是我一直在寻找的想法。谢谢!
      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 2021-01-02
      • 2010-12-22
      • 2019-06-16
      • 2021-05-02
      • 1970-01-01
      • 2015-08-01
      相关资源
      最近更新 更多