我在理解alias_method
/alias_method_chain
时有点困难。我有以下代码:alias_method,alias_method_chain和self.included
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)
我上面的解决方案的工作原理,但我怀疑这是做事的错误方式。如果任何一位红宝石老手能够向我展示这样做的更优雅的方式 - 和/或为什么第二种解决方案没有被调用 - 我会很感激。
至于为什么第二种方法不起作用,请参阅:http://stackoverflow.com/questions/5944278/overriding-method-by-another-defined-in-module – tsherif 2012-04-05 17:38:55
这有助于很多。非常感谢 – PlankTon 2012-04-05 18:10:36