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 扩展类能力,因此在初始化方法中没有显式包含
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的(相对)新 gem ,它为大型站点的授权提供了更具可扩展性的模式。
干杯,
J.P
| 归档时间: |
|
| 查看次数: |
1232 次 |
| 最近记录: |