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

时间:2015-11-08 08:50:27

标签: ruby ruby-on-rails-4 spree-auth-devise

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

谢谢大家。

2 个答案:

答案 0 :(得分:4)

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

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'

答案 1 :(得分:2)

你可以这样做:

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