覆盖gem的lib文件夹中的私有方法 [英] Override a private method in the lib folder of a gem

查看:100
本文介绍了覆盖gem的lib文件夹中的私有方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆