我正在尝试在 Rails 中使用 cancancan gem。我有一个名为
CPController
的控制器,在其中我声明了 load_and_authorize_resource
。另一个控制器ParticipantsController
继承自该控制器。在 ParticipantsController
内部,我想覆盖此特定功能,例如 load_and_authorize_resource class: 'User', instance_name: 'user'
,因为我的模型的名称是 user。有什么办法可以做到吗?
我尝试简单地在
ParticipantsController
中添加这一行,但它给了我一个NameError (uninitialized constant Participant)
。我猜它仍然运行父类的load_and_authorize_resource
。
我之前尝试过使用
skip_load_and_authorize_resource
,但它完全跳过加载和授权,即我的@user对象为零。
有解决办法吗?
家长班
module Api
module Cp
class CpController < Api::ApiController
load_and_authorize_resource
end
end
end
少儿班
module Api
module Cp
class ParticipantsController < Api::Cp::CpController
load_and_authorize_resource class: 'User', instance_name: 'user'
def show
@user
end
end
end
end
load_and_authorize_resource
实际上只是一个辅助方法,它将 before_action :load_and_authorize_resource
和附加的 args
添加到控制器。
这意味着您可以删除继承的
before_action
,然后添加新版本,如下所示:
module Api
module Cp
class ParticipantsController < Api::Cp::CpController
skip_before_action :load_and_authorize_resource
load_and_authorize_resource class: 'User', instance_name: 'user'
# ...