Ruby/Rails: практика alias_method

Я пытаюсь переопределить метод Rails "fields_for", который я сейчас делаю следующим образом:

module ActionView::Helpers::FormHelper
  include ActionView::Helpers::FormTagHelper

  alias_method :original_fields_for, :fields_for

  def fields_for(<my arguments>)
    # Some extra stuff
    # ...
    output.safe_concat original_fields_for(<my other arguments>)
  end

end

Функциональность работает просто отлично, но я начинаю подозревать, что мое использование alias_method не самое элегантное. Особенно, если бы я должен был упаковать эту функциональность в драгоценный камень, и там был другой драгоценный камень, который переопределял fields_for, я пишу, думая, либо мой новый fields_for ИЛИ альтернативный fields_for будет пропущен?

Предполагая, что так, каков правильный путь для добавления дополнительной функциональности к существующему методу rails?

Приветствия...

1 ответ

Решение

Похоже, именно такая ситуация alias_method_chain предназначен для (хотя я не знаю, если он будет работать на модуле - я использовал его только на AR::Base)

Вы бы просто сделали

module ActionView::Helpers::FormHelper
    include ActionView::Helpers::FormTagHelper

    alias_method_chain :fields_for, :honeypot

    def fields_for_with_honeypot(<my arguments>)
        # Some extra stuff
        # ...
        output.safe_concat fields_for_without_honeypot(<my other arguments>)
    end
end

интересная идея сделать это fields_for, но это должно работать.

Есть небольшой спор вокруг a_m_c, о котором вы должны знать - этот пост хорошо подводит итог http://erniemiller.org/2011/02/03/when-to-use-alias_method_chain/

В этом случае я не думаю, что вы можете использовать super потому что вы хотите обезьяна-патч form_for без изменения вызывающего кода / представлений.

Другие вопросы по тегам