我正在尝试覆盖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方法中加入一些额外功能的正确方法是什么?
干杯。。。
似乎正是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进行猴子修补。