我正在尝试使用恰好使用CanCan授权框架以及我的主应用程序的Forem gem。主应用程序和Rails引擎都有自己的 ability.rb 文件。
当我尝试进行一些授权检查时,布局中会出现问题:
<% if can? :update, User %>
<%= link_to_current_user :content_method => :login %>.
<% else %>
当我在引擎上使用布局文件时,它会查询它自己的ability.rb文件以进行授权。当然,我的主要应用程序没有规则,因此授权失败时不应该。我有什么方法可以强迫它去主打&#34;惭惭?
感谢。
答案 0 :(得分:4)
我认为最简单的解决方案是修补forem的定义以添加自己的声明:
class Forem::Ability
alias_method :orig_init, :initialize
def initialize(user)
orig_init(user)
# Put your own authorization code here.
end
end
class Ability < Forem::Ability; end
在引擎的上下文中,can?
方法必须使用引擎的控制器/命名空间来授权操作(Forem::Ability
),当在您自己的应用程序的上下文中时,它使用您自己的控制器而不是命名空间也是如此。
因此,我认为这里的解决方案(将Ability
和Forem::Ability
添加所有授权操作都可以解决您的问题。
更新:我现在意识到引擎的控制器的current_ability
方法可能会读取如下内容:
def current_ability
@current_ability ||= Forem::Ability.new(current_user)
end
你的(从cancan gem中拖欠)读取的内容如下:
def current_ability
@current_ability ||= Ability.new(current_user)
end
所以我上面的解决方案应该可以解决您的问题,但这可能是它所遇到的具体问题。
答案 1 :(得分:0)
到目前为止,我发现的唯一方法是将两个文件合并为一个,将它分成模块和猴子补丁启动时的两种能力。不漂亮..
答案 2 :(得分:0)
我还是红宝石的初学者,但我希望能帮到你。
<强>更新强>
如cancan/wiki/admin-namespace所述,另一个要尝试的问题是选择要为模型加载的能力文件。
创建自己的模型:
# in models/admin_ability.rb
class AdminAbility
include CanCan::Ability
def initialize(user)
# define admin abilities here ....
end
end
然后,将它用于您的模型
def current_ability
@current_ability ||= AdminAbility.new(current_user)
end
我希望这个解决方案可以解决您的问题。
斯蒂芬