6

spree-auth-devise gem には private メソッドがあります。メソッドはコントローラー 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 に答える