【问题标题】:Override a private method in the lib folder of a gem覆盖 gem 的 lib 文件夹中的私有方法
【发布时间】:2015-11-08 08:50:27
【问题描述】:

spree-auth-devise gem 中有一个私有方法。方法在控制器UserSessionsControllerhttps://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 中。

谢谢大家。

【问题讨论】:

  • 覆盖是什么意思?
  • @sagarpandya82 我的意思是修改或附加更多逻辑到方法。
  • 到目前为止你尝试了什么?

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


【解决方案1】:

你可以这样做:

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

【讨论】:

    【解决方案2】:

    当然你可以重写私有方法:

    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'
    

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 2011-01-01
      • 2013-01-31
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多