使用 SessionsController 和 RegistrationsController 中的回调方法扩展基础 DeviseController class

Extend base DeviseController class with method for callbacks in SessionsController and RegistrationsController

我的问题类似于this one,没有答案。

我想将 after_filter :identify_with_segment, only: [:create] 添加到我的 RegistrationsController < Devise::RegistrationsControllerSessionsController < Devise::SessionsController。由于这两个控制器本身都继承自 DeviseController,我认为实现此目的的 DRY 方法是扩展 DeviseController 并在那里定义方法。但是,我不断收到 unitialized constant 错误。

我的代码:

class DeviseController < DeviseController
  def identify_with_segment
    ..
  end
end

我意识到 class 的定义方式看起来不对。我也试过 class DeviseController < Devise::DeviseController 但这也不管用。

谁能解释扩展这些其他控制器所依赖的 DeviseController 的正确方法?

如果你想打开DeviseController,你可以试试这个:

class DeviseController
   def identify_with_segment
     # ...
   end
end

很多令人困惑的事情都是以严格的 DRY-ness 的名义完成的,这可能就是其中之一。有时,重复自己的话会让跟在你后面的人看得更清楚、更容易理解。

另一种选择是关注此功能,并 include 您的 RegistrationsControllerSessionsController 中的那个模块。然后它是明确的你在做什么,你没有修改你不拥有的 类 。类似于:

# app/controllers/concerns/whatever_it_is_this_is_doing.rb
module WhateverItIsThisIsDoing

  extend ActiveSupport::Concern

  def identify_with_segment
    # ...
  end

  included do
    after_filter :identify_with_segment, only: [:create]
  end

end

# app/controllers/registrations_controller.rb
class RegistrationsController
  include WhateverItIsThisIsDoing
end

# app/controllers/sessions_controller.rb
class SessionsController
  include WhateverItIsThisIsDoing
end