6

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

谢谢你们。

4

2 回答 2

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

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

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
于 2015-11-08T09:23:43.963 回答
3

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

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'
于 2015-11-08T10:54:31.693 回答