我有点难以理解alias_method
/ alias_method_chain
。我有以下代码:
module ActionView::Helpers
module FormHelper
alias_method :form_for_without_cherries, :form_for
def form_for(record, options = {}, &proc)
output = 'with a cherry on top'.html_safe
output.safe_concat form_for_without_cherries(record, options = {}, &proc)
end
end
end
这正是我想要的 - 将“顶部有樱桃”附加到任何form_for
呼叫的顶部。
但我的理解是,由于某些原因,这不是好的代码。首先,它不会链接任何其他覆盖,form_for(?)
所以如果我要编写第二个form_for
附加“顶部还有另一个樱桃”的方法,它就不会显示。其次,alias_method
并且alias_method_chain
是过时的解决方案,我应该使用self.included
& 发送到模块。
但是我不能self.included
调用这个form_for
方法——它只是一直调用父方法。这是我正在尝试的:
module CherryForm
def self.included(base)
base.extend(self)
end
def form_for(record, options = {}, &proc)
output = 'with a cherry on top'.html_safe
output.safe_concat super(record, options = {}, &proc)
end
end
ActionView::Helpers::FormHelper.send(:include, CherryForm)
我的上述解决方案有效,但我怀疑这是错误的做事方式。如果任何红宝石老手可以向我展示一种更优雅的方式 - 和/或为什么不调用第二个解决方案 - 我将不胜感激。