![](/img/trans.png)
[英]what is the difference between alias_method and alias_method_chain?
[英]alias_method, alias_method_chain, and self.included
我在理解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
这正是我想要的 - append“顶部有樱桃”到任何form_for
调用的顶部。
但我的理解是,由于某些原因,这不是好的代码。 首先,它不会链接form_for(?)
的任何其他覆盖,所以如果我要编写第二个form_for
方法,它附加了“还有另一个 cherry on top”,它不会显示。 其次, 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)
我的上述解决方案有效,但我怀疑这是错误的做事方式。 如果任何 ruby 退伍军人可以向我展示一种更优雅的方法 - 和/或为什么不调用第二种解决方案 - 我将不胜感激。
当您修补某些东西时,您必须重新定义该方法,因为没有可继承的超级(因此您不能使用第二个代码摘录)。
复制当前的方法实现并添加自己的实现只是自找麻烦,所以这就是 alias_method 的用武之地。
alias_method :form_for_without_cherries, :form_for
它实际上创建了原始方法的克隆,您可以使用它代替 super。 你不能链接猴子补丁的事实不是错误,而是一个特性。
rails alias_method_chain 方法确实被弃用了,但这只是因为它从一开始就是一个糟糕的主意。 然而,alias_method 是一个纯粹的 ruby 方法,如果使用得当,可以提供一种优雅的猴子修补代码的方法,这就是为什么我很确定它不会很快消失的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.