gpt4 book ai didi

ruby-on-rails - alias_method、alias_method_chain 和 self.included

转载 作者:数据小太阳 更新时间:2023-10-29 07:57:06 24 4
gpt4 key购买 nike

我在理解 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

这正是我想要的 - 将“with a cherry on top”附加到任何 form_for 调用的顶部。

但我的理解是,由于某些原因,这不是好的代码。首先,它不会链接到 form_for(?) 的任何其他覆盖,所以如果我要编写第二个 form_for 方法,它附加了“还有另一个樱桃” ,它不会显示。其次,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​​ 老手可以向我展示一种更优雅的方式来执行此操作 - 和/或为什么不调用第二个解决方案 - 我将不胜感激。

最佳答案

当你修补某些东西时,你必须重新定义方法,因为没有可以继承的父类(super class)(所以你不能使用第二个代码摘录)。

复制当前的方法实现并添加自己的实现只是自找麻烦,所以这就是 alias_method 的用武之地。

alias_method :form_for_without_cherries, :form_for

它实际上创建了原始方法的克隆,您可以使用它代替 super。你不能链接猴子补丁的事实不是错误,而是一个特性。

rails alias_method_chain 方法确实被弃用了,但这只是因为它从一开始就是个糟糕的主意。然而,alias_method 是一种纯 ruby​​ 方法,如果使用得当,可以提供一种优雅的猴子修补代码的方法,这就是为什么我很确定它不会很快消失的原因。

关于ruby-on-rails - alias_method、alias_method_chain 和 self.included,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10032927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com