少しわかりづらい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
form_for
これは、私が望んでいることを正確に実行します。呼び出しの先頭に「チェリーを上に」を追加します。
しかし、私の理解では、これはいくつかの理由で適切なコードではありません。まず、他のオーバーライドにチェーンされないform_for(?)
ため、「さらに別のチェリーを上に」追加する2番目のform_for
メソッドを作成した場合、表示されません。そして第二に、そして、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)
私の上記の解決策は機能しますが、それが間違ったやり方であるのではないかと疑っています。ルビーのベテランがこれを行うためのよりエレガントな方法を教えてくれるなら-そして/または2番目の解決策が呼ばれていない理由-私は感謝するでしょう。