簡體   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