22

Rails の使い慣れたヘルパーを使用したいのですが、機能が少し変更されています。私の見方では、次のようなことができるようになりたいです。

module AwesomeHelper
  #... create alias of stylesheet_link_tag to old_stylesheet_link_tag
  def stylesheet_link_tag(*args)
    if @be_awesome
      awesome_stylesheet_link_tag *args
    else
      old_stylesheet_link_tag *args
    end
  end
end

私の見方では、次の 3 つのオプションがあります。

  1. モンキー パッチ: Rails ヘルパー モジュールの再開。Rails チームがヘルパー モジュールの名前を変更した場合、私のコードは脆弱性の原因になります。克服できないわけではありませんが、理想的ではありません。
  2. 別のメソッド名を使用する: Common Rails インターフェイスに固執しようとすると、失敗する可能性があります。私の変更が他の開発者の混乱の原因になる可能性があります
  3. デタッチ方法 (新規):これが機能するかどうか、または 1 と同じ欠点があるかどうかは不明です。これについては調査しますが、これは良い出発点になる可能性があります。

ここでの質問は、これらの次善の解決策の 1 つに固執しているのか、それとも考慮していない別の方法があるのか​​ということです。オプション 3 を選択する場合、Rails ヘルパー モジュールに直接対処せずにそれを行う方法はありますか?

(注:質問に何も追加しないため、コンテキストを削除しました。)

4

4 に答える 4

38

リストされたどのオプションよりも優れた方法があります。使用するだけsuperです:

module AwesomeHelper
  def stylesheet_link_tag(*sources)
    if @be_awesome
      awesome_stylesheet_link_tag *sources
    else
      super
    end
  end
end

stylesheet_link_tagAwesomeHelper でオーバーライドすると、 get が呼び出されたときにstylesheet_link_tagRuby がActionView::Helpers::AssetTagHelper. is の場合@be_awesometrue、担当してその場で停止できます。そうでない場合は、かっこなしの への呼び出しはsuper、Rails 実装までのすべての引数を透過的に通過します。このようにすれば、Rails コア チームがあなたのことを動かしてくれることを心配する必要はありません。

于 2012-05-09T22:54:37.680 に答える
5

私はこの宝石を使用しないので、より一般的な方法であなたに答えます。

ヘルパーへの呼び出しをログに記録したいとしますlink_to(ええ、考案された例ですが、アイデアを示しています)。APIを見ると、モジュールlink_to内にあることがわかります。ActionView::Helpers::UrlHelperしたがって、たとえば、config/initializersディレクトリに次の内容のファイルを作成します。

# like in config/initializers/link_to_log.rb
module ActionView::Helpers::UrlHelper

    def link_to_with_log(*args, &block)
        logger.info '**** LINK_TO CALL ***'
        link_to_without_log(*args, &block) # calling the original helper
    end

    alias_method_chain :link_to, :log
end

この機能のコア- alias_method_chain(クリック可能)。メソッドを定義した後に使用しxxx_with_featureます。

于 2012-05-06T15:45:20.043 に答える
5

使ってみてくださいalias_method:

module AwesomeHelper
  alias_method :original_stylesheet_link_tag, :stylesheet_link_tag

  def stylesheet_link_tag(*sources)
    if @be_awesome
      awesome_stylesheet_link_tag *sources
    else
      original_stylesheet_link_tag *sources
    end
  end
end
于 2012-05-14T16:20:20.320 に答える
2

オプション#2を検討することを強くお勧めします。これは、呼び出し元に明らかな方法でRailsメソッドの動作をオーバーライドします。

新しいメソッドを呼び出しawesome_stylesheet_link_tagて、他の Rails 開発者がコードを読み、「link タグの何がすごいの?」と質問できるようにする必要があります。

より小さな変更として、オーバーライドを行うことができますが:awesome => true、引数として渡すことができるため、少なくとも何かが進行中であるという手がかりが得られます。

のような広く使用されているメソッドの動作を変更するstylesheet_link_tagと、何も必要ないところで将来の誤解が生じる可能性があります。

于 2012-05-14T02:39:10.357 に答える