【问题标题】:hide or show content with CanCan based on role?根据角色使用 CanCan 隐藏或显示内容?
【发布时间】:2012-02-07 19:48:23
【问题描述】:

当用户不是特定角色时,我需要在表单中隐藏一些表单字段。那怎么可能呢?从我知道的文档中,您可以授予对某些操作的访问权限,例如显示、更新或仅管理

但是如何做类似 if user.role 的事情? :管理员

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 cancan


    【解决方案1】:
      if cannot? :manage ,Articles
      flash[:notice] = "you are not authorized to manage articles"
    
      end
    

    【讨论】:

    • 问题是我有一个配置文件控制器并且只想限制对部分表单字段的访问,因此完整用户将获得更多表单字段(它用于搜索表单)我没有看到我怎么能在这个设置中用 CanCan 做到这一点
    【解决方案2】:

    如果你想通过 cancan 来做这一切,这一切都取决于你如何设置你的能力。考虑到这一点,如果用户拥有完全权限,您可以使用:

    <% if can? :manage, :all %>
      <%= f.text_field :field_name %>
    <% end %>
    

    否则,您可以更具体并指定用户需要具有喜欢的权限的基本模型/操作:

    <% if can? :update, Profile %>
      <%= f.text_field :field_name %>
    <% end %>
    

    【讨论】:

      【解决方案3】:

      这个答案主要是从CanCan documentation复制而来的。

      首先,您定义一个Ability class。您可以使用以下方法生成其中之一:

      rails g cancan:ability
      

      这应该会给你类似的东西:

      class Ability
        include CanCan::Ability
      
        def initialize(user)
          user ||= User.new # guest user (not logged in)
          if user.admin?
            can :manage, :all
          else
            can :read, :all
          end
        end
      end
      

      在这个类中,您可以定义您希望用户拥有的任何能力。在上面的示例中,管理员可以管理任何对象。非管理员或未登录的用户可以读取任何对象。

      定义能力后,您需要使用can? 方法check your abilities。在您看来,您可以编写如下内容:

      <% if can? :create, Project %>
        <!-- your form view logic goes here -->
      <% end %>
      

      【讨论】:

      • 这会抛出一个未定义的方法“角色?”我从配置文件控制器部分(不是集合部分)内部调用它,奇怪的是它给出了未定义的方法。角色处于可访问的属性中,并且角色系统在所有其他地方都可以正常工作,只是我无法让这个 if 语句正常工作
      • 我猜他的意思是你应该扮演一个角色?在您的用户模型上使用方法,然后像没有 cancan 的情况一样简单地检查它
      • 我的答案应该在您显示表单的视图中调用。我正在更新我的答案。
      • 好的,我对此进行了一些研究,解决此问题的答案是如何获取 current_user.id ( devise ) 的角色,这样我就可以检查某个用户是否 == admin 或 ==默认如果 current_user.id == admin 的角色,那么我会显示额外的表单字段,否则不会。关于如何获取当前用户角色的任何想法?
      • 您将不得不发布一些代码。我真的不知道为什么我的回答不起作用。我需要看看你到目前为止做了什么。
      【解决方案4】:

      你可以使用:

      <% if user.admin? %>
        <!-- form field -->
      <% elsif user.editor? %>
        <!-- another form field -->
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 1970-01-01
        • 2017-12-13
        • 2019-05-17
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        相关资源
        最近更新 更多