覆盖gem的lib文件夹中的私有方法

spree-auth-devise gem中有一个私有方法。 该方法位于控制器UserSessionsController内部https://github.com/spree/spree_auth_devise/blob/master/lib/controllers/frontend/spree/user_sessions_controller.rb

我希望覆盖函数“redirect_back_or_default”。

这可能吗?

更新

在您的答案混合和匹配并进行一些谷歌搜索后,我得出了这个解决方案:

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中。

谢谢你们。

当然你可以覆盖私有方法:

 class Super private def i_am_private 'private method' end end class Sub < Super private def i_am_private 'overridden ' << super end end Sub.new.send(:i_am_private) # => 'overridden private method' 

你可以这样做:

 class HelloWorld def run say_hello_world end private def say_hello_world puts "hello world" end end HelloWorld.new.run "hello world" => nil 

现在让我们扩展/覆盖当前行为。

 class HelloWorld private def say_hello_world puts "Goodbye" end end HelloWorld.new.run "Goodbye" => nil 

所以,既然这是有效的,那么猴子修补它怎么样。 像这样的东西:

 class Spree::UserSessionsController < Devise::SessionsController private def redirect_back_or_default(default) # your logic end end