レールの使い慣れたヘルパーを使用したいが、少し変更された機能を使用したい。私はそれを参照してください方法は、私のような何かを行うことができるようにしたい:レールのヘルパーモジュールの再オープン:オリジナルへのアクセスでレールヘルパーをオーバーライド
- モンキーパッチング:
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と同じ欠点があるかどうかはわかりません。出発点。
ここで問題になるのは、これらの準最適解のうちの1つに固執しているのですか、それとも私が考慮していない別の方法がありますか?オプション3に行くと、レールヘルパーモジュールに直接アドレスを指定しなくてもそれを行う方法はありますか?
(注:私は、コンテキストを削除した、それは質問には何も加えないよう)
あなたが知っていることは...それはとても狂った明白です、私は私の頭脳を動かして私はそれがうまくいかないと思った!私は今夜それを試してみるつもりです、もしそれがうまくいくなら、私はおそらくレンガの壁を含む私の脳で深刻な言葉を持つでしょう。あなたの答えを受け入れた後、もちろん:D – user208769
@ user208769 Hehehe。それは素晴らしいです。私が理解しているように、この方法でメソッドをオーバーライドすることは、どのような状況でも一般に望ましい方法です。 [Class#ancestors](http://ruby-doc.org/core-1.9.3/Module.html#method-i-ancestors)は、ハイジャックメソッドへのメソッドルックアップパスの良い場所を見つけるのに本当に役立ちますディスパッチ(または最適化を行うためにオーバーライドされたカスタムモジュールが含まれている必要がある場所)。 – Cade
何ですか? :)あなたは冗談を言う必要があります!これは巨大な問題です! AssetTagHelperを含むあらゆるクラスにヘルパーを含める必要があります。時間が飛んで、あなたや他の誰かがあなたのパッチが含まれることを忘れることができます。あなたは単にAssetTagHelperを組み込み、なぜ私のサイトが異なって見えるのか不思議に思うようになります。あなたとパッチメーカーが同じ人であればいいですね。しかし、もしそうでなければ? – jdoe