我正在尝试覆盖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并不是最优雅的。最特别的是,如果我要将此功能打包到gem中,并且还有另一个gem覆盖了fields_for,我是否会想到我的新fields_for或备用fields_for会被跳过?
假设是,正确的方法是将一些额外的功能用于现有的rails方法?
干杯...
答案 0 :(得分:3)
这似乎恰好是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而不修改调用代码/视图。