覆盖gem的lib文件夹中的私有方法 [英] Override a private method in the lib folder of a gem
问题描述
spree-auth-devise gem中有一个私有方法.该方法位于控制器UserSessionsController内部 https://github.com/spree/spree_auth_devise/blob/master/lib/controllers/frontend/spree/user_sessions_controller.rb
There is a private method in the spree-auth-devise gem. The method is inside the controller UserSessionsController https://github.com/spree/spree_auth_devise/blob/master/lib/controllers/frontend/spree/user_sessions_controller.rb
我希望覆盖函数"redirect_back_or_default".
I wish to override the function "redirect_back_or_default".
这可能吗?
在您的答案之间进行混合和匹配并进行了一些谷歌搜索之后,我得出了以下解决方案:
After mixing and matching between your answers and doing some googling, I arrived at this solution:
Spree::UserSessionsController.class_eval do
private
def redirect_back_or_default(default)
if default == "/admin/orders" or session["spree_user_return_to"] == "/admin/orders"
redirect_to("/admin/users")
else
redirect_to(session["spree_user_return_to"] || default)
end
session["spree_user_return_to"] = nil
end
end
并且我已将脚本文件放置在config/initializers中.
And I have placed the script file in config/initializers.
谢谢大家.
推荐答案
您可以执行以下操作:
class HelloWorld
def run
say_hello_world
end
private
def say_hello_world
puts "hello world"
end
end
HelloWorld.new.run
"hello world"
=> nil
现在让我们扩展/覆盖当前行为.
Now let's extend/override the current behaviour.
class HelloWorld
private
def say_hello_world
puts "Goodbye"
end
end
HelloWorld.new.run
"Goodbye"
=> nil
因此,既然这可行且可行,那么猴子如何修补它. 像这样的东西:
So since this works and is possible, how about monkey patching it. Something like this:
class Spree::UserSessionsController < Devise::SessionsController
private
def redirect_back_or_default(default)
# your logic
end
end
这篇关于覆盖gem的lib文件夹中的私有方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!