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 без изменения вызывающего кода / представлений.