![](/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.