我有一个类似于
的方法的控制器def show
if params[:format].eql?("pdf")
// do something
elsif params[:format].eql?("csv")
// do something
end
end
但我有不同角色的用户。所以我使用CanCan来管理访问控制。
现在我希望X角色可以在控制器iff show
params[:format].eql?("csv")
我认为它可以像; can :show, resource if params[:format].eql?("csv")
。那么如何将参数发送给ability.rb?
有什么想法吗?
感谢。
答案 0 :(得分:26)
在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
答案 1 :(得分:6)
最新答案在CanCan wiki中:https://github.com/ryanb/cancan/wiki/Accessing-Request-Data
答案 2 :(得分:1)
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?
方法仅返回true或false。我通常喜欢使用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级别上捕获异常。