【问题标题】:Passing params to CanCan in RoR在 RoR 中将参数传递给 CanCan
【发布时间】:2012-02-27 21:04:39
【问题描述】:

我有一个控制器,其方法如下:

def show

    if params[:format].eql?("pdf")
    // do something
    elsif params[:format].eql?("csv")
    // do something
    end
end

但我有不同角色的用户。所以我使用 CanCan 来管理访问控制。 现在我希望 X 角色可以在控制器 iff params[:format].eql?("csv") 中执行操作 show

我认为它可以像 ;can :show, resource if params[:format].eql?("csv")。那么如何将参数发送到ability.rb?

有什么想法吗?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby cancan


    【解决方案1】:

    在 ApplicationController 中添加以下内容:

    # CanCan - pass params in to Ability
    # https://github.com/ryanb/cancan/issues/133
    def current_ability
      @current_ability ||= Ability.new(current_user, params)
    end
    

    【讨论】:

    • 完美 - 除了缩进 4 个空格:D
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      can 有两个参数:第一个是用户试图对资源执行的操作类型,第二个是资源(可以是类名或实例变量)本身。如果你的技能设置正确,你应该可以做这样的事情:

      def show
        if params[:format].eql?("pdf")
          // do something
        elsif params[:format].eql?("csv")
          if can? :read, resource
            #do stuff
          end
        end
      end
      

      不要忘记,在运行任何 CanCan 检查之前,您必须先对用户进行身份验证。 can? 方法只返回真或假。我通常喜欢使用authorize! 方法来检查能力。与can 不同,它会出现CanCan::AccessDenied 错误,您可以优雅地抢救和处理。类似于:

      #models/ability.rb
      class Ability
        include CanCan::Ability
      
        def initialize(user)
          user ||= User.new # guest user (not logged in)
      
          if user.role? :admin
            can :manage, :all
          elsif user.role? :hiring_manager
            can [:read, :update], Post, user_id: user.id
          end
        end
       end
      
      #controllers/posts_controller.rb
      class PostsController < ApplicationController::Base
        before_filter :authenticate_user
      
        def show
          @post = Post.find(params[:id])
          authorize! :read, @post # will thorow an exception if not allowed
        end
      end 
      

      然后,我只是在 ApplicationController 级别捕获异常。

      【讨论】:

      • 很好的例子西蒙,但这不是我要找的。因为我只是使用 params[:format] 来决定方法的行为。在您的示例中,您使用参数来查找记录。记录传递给决定访问控制的能力。但我没有以你的方式使用参数。
      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2015-10-13
      • 2019-09-27
      • 1970-01-01
      • 2017-08-14
      相关资源
      最近更新 更多