gpt4 book ai didi

ruby-on-rails - 单独文件中的康康舞能力

转载 作者:数据小太阳 更新时间:2023-10-29 08:40:33 27 4
gpt4 key购买 nike

是否可以在单独的文件中定义能力并将它们包含在初始化方法内的 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 扩展类 Ability :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

在您的 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

使用此模式,您可以将您的能力分解为多个模块(也许,每个模块一个,您必须为其定义用户能力)。

看看Pundit

同样值得注意的是,看看名为 Pundit 的(相对)新 gem ,它为大型网站的授权提供了更具可扩展性的模式。

干杯,

日本

关于ruby-on-rails - 单独文件中的康康舞能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7738376/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com