0

我想知道它们是否是一种使用 cancan 来根据特定资源的角色定义能力的方式。

现在我有这样的东西,但问题是它会遍历用户每次拥有的每个角色,就像他有 2 倍的 role1 一样,即使它在不同的 Stuff 实例上。

def initialize(user)
    @user = user || User.new
    @user.roles.map(&:name).each{|name| send(name)}
  end

 def role1
    can :manage, Stuff
 end

我该如何优化呢?

我想过类似的事情:

def initialize(user)
    @user = user || User.new

     can :manage, Object do |object|
       roles = @user.roles.where(resource_id: object.id, resource_type: object.class)
       unless roles.empty?
         roles.map(&:name).each{|name| send(name)}
       end
     end
  end

但它仍然存在将“:管理”操作发送给任何对资源具有任何其他能力的用户的问题......

那么他们有什么方法可以访问 cancan 的初始化函数中的资源实例吗?

4

1 回答 1

1

我找到了一些可以避免使用此问题的 :manage https://github.com/ryanb/cancan/issues/133

所以我添加了

  def current_ability
    @current_ability = Ability.new(current_user, @resource)
  end

在“授权!”之前的控制器中的 application_controller.rb 中 调用我已经定义了一个名为@resource 的实例变量

像这样:

def create
    project = Project.find(params[:project_id])
    @resource = project
    authorize! :create_stories, project
    ....
 end

并更新了ability.rb

 def initialize(user, resource)
    @user = user || User.new

    roles = @user.roles.where(resource_id: resource.id, resource_type: resource.class)
    if roles.empty?
      false
    else
      roles.map(&:name).each{|name| send(name)}
    end
  end

  def role1
    can :go_and_make_coffee
  end

如果它对某人有帮助,那就尽情享受吧

于 2014-08-21T22:40:50.633 回答