重写超类的load_and_authorize_resource

问题描述 投票:0回答:1

我正在尝试在 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
ruby-on-rails ruby cancancan
1个回答
0
投票

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'

      # ...
© www.soinside.com 2019 - 2024. All rights reserved.