4

Railsの「fields_for」メソッドをオーバーライドしようとしています。これは現在、次のように実行しています。

module ActionView::Helpers::FormHelper
  include ActionView::Helpers::FormTagHelper

  alias_method :original_fields_for, :fields_for

  def fields_for(<my arguments>)
    # Some extra stuff
    # ...
    output.safe_concat original_fields_for(<my other arguments>)
  end

end

機能は問題なく機能しますが、alias_methodの使用が最もエレガントではないのではないかと思い始めています。特に、この機能をgemにパッケージ化し、fields_forを上書きする別のgemがあった場合、新しいfields_forまたは代替fields_forのいずれかがスキップされると考えて書き込みますか?

そうだとすると、既存のRailsメソッドにいくつかの追加機能を追加する正しい方法は何ですか?

乾杯...

4

1 に答える 1

3

これはまさに意図された状況のようalias_method_chainです(モジュールで動作するかどうかはわかりませんが、AR :: Baseでのみ使用しています)

あなたはただやるだろう

module ActionView::Helpers::FormHelper
    include ActionView::Helpers::FormTagHelper

    alias_method_chain :fields_for, :honeypot

    def fields_for_with_honeypot(<my arguments>)
        # Some extra stuff
        # ...
        output.safe_concat fields_for_without_honeypot(<my other arguments>)
    end
end

これを行うのは興味深いアイデアですが、うまくfields_forいくはずです。

あなたが知っておくべきa_m_cの周りに小さな論争があります-この投稿はそれをうまくまとめていますhttp://erniemiller.org/2011/02/03/when-to-use-alias_method_chain/

superこの場合、呼び出し元のコード/ビューを変更せずにform_forにモンキーパッチを適用したいので、使用できないと思います。

于 2012-06-14T21:14:52.737 に答える