是否可以在单独的文件中定义能力并将其包含在初始化方法内的ability.rb文件中?
下面的代码返回:尝试并得到:未定义的方法'can'
能力.rb
def initialize(user)
include MyExtension::Something::CustomAbilities
...
end
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
完美的解决方案,如果可能的话,是使用Ability.send :include/extend扩展类Ability,这样就无需在初始化方法中显式包含
最佳答案
只需包含模块并在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
在您的lib/project_ability.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
使用此模式,您可以将您的能力分解为各种模块(也许,您必须为其定义用户能力的每个模型都有一个模块)。
看看Pundit
另外值得注意的是,看看(相对)新的 gem,名为 Pundit ,它为大型网站的授权提供了一种更具可扩展性的模式。
干杯,
日本
关于ruby-on-rails - 康康舞能力在单独的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7738376/