繁体   English   中英

alias_method、alias_method_chain 和 self.included

[英]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_methodalias_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM