Рубин. Вызов Super из переопределенного метода - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь переопределить метод redirect_to, чтобы добавить дополнительный параметр в запросы get (если таковые имеются)

Метод redirect_to здесь

module ActionController
...................

  module Redirecting
    extend ActiveSupport::Concern
    include AbstractController::Logger
    ...........................

    def redirect_to(options = {}, response_status = {}) #:doc:
      ............................
      self.status        = _extract_redirect_to_status(options, response_status)
      self.location      = _compute_redirect_to_location(options)
      self.response_body = "<html><body>You are being <a href=\"#    {ERB::Util.h(location)}\">redirected</a>.</body></html>"
    end

  end

end

Вот как я пытаюсь переопределить

module ActionController

    module Redirecting
      def redirect_to(options = {}, response_status = {})

        if options
          if options.is_a?(Hash)
            options["custom_param"] = @custom_param
          else
            if options.include? "?" 
              options = options + "&custom_param=true"
            else
              options = options + "?custom_param=true"
            end 
          end
        end 

        super 

      end

  end

end 

Я, очевидно, делаю это неправильно, и вызов метода super не работает так, как я хотел. Надеюсь, что кто-то может помочь.

1 Ответ

4 голосов
/ 27 февраля 2012

Я считаю, что проблема здесь в том, что вы переопределяете метод redirect_to, а не определяете его в новом месте.super не может вызвать оригинал, потому что он больше не существует.

Метод, который вы ищете, это alias_method_chain

module ActionController
  module Redirecting

    alias_method_chain :redirect_to, :extra_option

    def redirect_to_with_extra_option(options = {}, response_status = {})

      if options
        ...
      end

      redirect_to_without_extra_option(options, response_status)
    end
  end
end

Хотя я думаю, что более дружественный для Rails способ переопределить redirect_to в вашем ApplicationController

class ApplicationController
  ....
  protected
    def redirect_to(...)
      if options
        ....
      end
      super
    end
end

Преимущества этого подхода состоят в том, что вы не исправляете рельсы, и теперь в контроллере приложения установлен параметр для конкретного приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...