如何覆盖gem文件以便从我的引擎访问它?

时间:2017-06-16 09:20:39

标签: ruby-on-rails override rails-engines

我在Rails引擎上使用Devise,我想覆盖一个特定的文件,即:lib/devise/controller/helpers.rb

我尝试将其放入myengine/lib/devise/controller/helpers.rb,但它似乎无法正常工作。

如何覆盖该文件以便从我的引擎访问?如果我能在普通的Rails应用程序上做到这一点,我会很棒(我可以自己弄清楚其余部分)

目的是调试那段代码。见this issue

1 个答案:

答案 0 :(得分:0)

我通常会将它们放入初始化程序中,以便我明确知道我对它们进行了修补:

覆盖signed_in_root_path方法的示例:

# initializers/devise_controllers_helpers_patch.rb

module Devise
  module Controllers
    module Helpers
      def signed_in_root_path(resource_or_scope)
        puts 'THIS IS MY OWN CODE'
        puts 1 + 1 == 2

        scope = Devise::Mapping.find_scope!(resource_or_scope)
        router_name = Devise.mappings[scope].router_name

        home_path = "#{scope}_root_path"

        context = router_name ? send(router_name) : self

        if context.respond_to?(home_path, true)
          context.send(home_path)
        elsif context.respond_to?(:root_path)
          context.root_path
        elsif respond_to?(:root_path)
          root_path
        else
          "/"
        end
      end
    end
  end
end