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

Hom*_*oud 6 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
Run Code Online (Sandbox Code Playgroud)

我已将脚本文件放在 config/initializers 中。

谢谢你们。

Bry*_*mar 4

你可以这样做:

class HelloWorld
  def run
    say_hello_world
  end

  private 
    def say_hello_world
      puts "hello world"
    end
end

HelloWorld.new.run 
"hello world"
=> nil
Run Code Online (Sandbox Code Playgroud)

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

class HelloWorld 
  private
    def say_hello_world
      puts "Goodbye"
    end 
end

HelloWorld.new.run
"Goodbye"
=> nil
Run Code Online (Sandbox Code Playgroud)

既然这是可行的并且是可能的,那么猴子修补它怎么样?像这样的东西:

class Spree::UserSessionsController < Devise::SessionsController
  private
    def redirect_back_or_default(default)
      # your logic
    end
end
Run Code Online (Sandbox Code Playgroud)