如何覆盖 gem 文件以便从我的引擎访问它?
How can I override a gem file in order to access it from my engine?
我在 Rails 引擎上使用 Devise,我想覆盖特定文件,即:lib/devise/controller/helpers.rb
。
我试图将它放入 myengine/lib/devise/controller/helpers.rb
但它似乎不起作用。
如何覆盖该文件以便从我的引擎访问?如果我也能在普通的 Rails 应用程序上做到这一点,那就太好了(我可以自己弄清楚其余部分)
目的是调试那段代码。参见 this issue
我通常将它们放入初始化程序中,这样我就可以清楚地知道我猴子修补了它们:
覆盖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
我在 Rails 引擎上使用 Devise,我想覆盖特定文件,即:lib/devise/controller/helpers.rb
。
我试图将它放入 myengine/lib/devise/controller/helpers.rb
但它似乎不起作用。
如何覆盖该文件以便从我的引擎访问?如果我也能在普通的 Rails 应用程序上做到这一点,那就太好了(我可以自己弄清楚其余部分)
目的是调试那段代码。参见 this issue
我通常将它们放入初始化程序中,这样我就可以清楚地知道我猴子修补了它们:
覆盖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