cancan 能力在单独的文件中

Art*_*r79 2 ruby ruby-on-rails cancan

是否可以在单独的文件中定义能力并将它们包含在 initialize 方法内的ability.rb文件中?

下面的代码返回:尝试并得到:未定义的方法“可以”

能力.rb

def initialize(user)
  include MyExtension::Something::CustomAbilities
  ...
end
Run Code Online (Sandbox Code Playgroud)

lib/my_extension/something.rb

module MyExtension::Something

  module CustomAbilities
      can :do_it, Project do |project|
      check_something_here and return true or false...
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

如果可能的话,完美的解决方案是使用 Ability.send :include/extend 扩展类能力,因此在初始化方法中没有显式包含

Jos*_*ter 5

只需包含模块并调用方法 initialize

这里的技巧是为您的每个能力创建模块,将它们包含在您的基本ability.rb文件中,然后在您的initialize方法中运行特定的方法,如下所示:

在您的ability.rb文件中:

class Ability

  include CanCan::Ability

  include ProjectAbilities 

  def initialize user
    # Your "base" abilities are defined here.

    project_abilities user
  end  

end
Run Code Online (Sandbox Code Playgroud)

在您的lib/project_abilities.rb文件中:

module ProjectAbilities

  def project_abilities user
    # New abilities go here and later get added to the initialize method
    # of the base Ability class.

    can :read, Project do |project|
      user.can? :read, project.client || user.is_an_admin?
    end 
  end

end
Run Code Online (Sandbox Code Playgroud)

使用这种模式,您可以将您的能力分解为各种模块(也许,每个模型对应一个模块,您必须为其定义用户能力)。

看看Pundit

另外值得注意的是,请看一下名为Pundit的(相对)新 gem ,它为大型站点的授权提供了更具可扩展性的模式。

干杯,

J.P