少し難解です。alias_method
/alias_method_chain
です。私は、次のコードを持っている:alias_method、alias_method_chain、self.included
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(?)
の他のオーバーライドではチェーンされないので、もし私がもう一つの "もう一つのチェリー"を追加した第二の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)
私の上記の解決策は動作しますが、私はそれが物事の間違った方法だ疑いを持っています。 Rubyのベテランが私にこれを行うためのよりエレガントな方法を示すことができれば - そして/またはなぜ2番目の解決策が呼び出されないのか - 私は感謝しています。
なぜ2番目の方法が機能しないのかについては、こちらをご覧ください:http://stackoverflow.com/questions/5944278/overriding-method-by-another-defined-in-module – tsherif
これは多くの助けになりました。多くの感謝 – PlankTon