2010-12-16 6 views
14

私のようなものを持つ猿パッチングRailsのエンジンです:Railsで自動ロードされるmonkey-patchコードはどうですか?

SomeClass.class_eval do 
    # ... 
end 

私は、少なくとも開発モードで、ウェブサイトを打つ、それは動作しますが、それは私のパッチのようなものだ二回目は存在しなかった最初の時間。私はそれがRailsがエンジン(ベンダーにインストールされている)を自動リロードしていて、コードをリロードしていないと考えています。これはRails 2.3です。

私のコードも再読み込みされるようにする方法はありますか?

+0

私は一度同様の問題に遭遇し、私がそれを修正できる唯一の方法は、私の開発マシンで生産モードでレールを走らせることでした。私もこれに興味があります。 – kikito

+0

@egarcia:ああ、私たちは今回より良い解決策を見つけることができれば幸いです。 – Pablo

+0

コードを実行するにはどうすればいいですか?それはウェブブリックか雑草か乗客ですか?レールとサーバのバージョンを投稿してください。 – mpapis

答えて

0

残念ながら、Rails 2.xのリロード機構にフックする方法はありません。 あなたができることは、あなたのパッチをappまたはlibディレクトリのどこかに置くことです。 (おそらくlib/core_extが好ましい場所です)。次に、設定のautoload_pathsにディレクトリを追加します。

class_evalではなく、クラスを開く必要がある場合もあります。

+0

monkey-patchは既にlib /にあります。これは既にRails 2のautoload_pathsにあります。なぜそうはわかりませんが、class_evalの代わりにclassキーワードを使用してクラスを開くと、後で例外が発生し、エラーになります。 – Pablo

4

パッチを/ config/initializers内の.rbファイルに置くと、それが動作するはずです。

+0

class_evalとto_prepareの違いは何ですか? – montrealmike

0

これは醜いですが、この種のコードをenvironments.rbの底に置くと、起動時に正しいロード順序が常に保証されることがわかりました。

18

編集:このソリューションは、Rails :: Railtieの一部の機能に依存しているため、Rails 3以降でのみ動作します。このコードをイニシャライザに入れます。

この質問はかなり古いですが、ここで私が見つけた解決策です:

Rails.configuration.to_prepare do 
    SomeClass.class_eval do 
    # ... 
    end 
end 

これは、開発モードでのリクエストごとにクラスをリロードするレールを強制的に、一度だけ生産インチ

+0

これはRails 3で完璧に機能しました。ありがとうございました。 –

+0

これはまた、Rails 4の私のために働いた – ABMagil

+1

Rails 5の私のために働いています。 – ttotherat

5

私は最初の猿パッチを書いたばかりなので、周りの慣習を思いつく必要がありました。 lib/ext/

  1. 置き拡張機能を:ここに私が思い付いたものです。 (#rubyonrailsのIRCの部屋でベテランworkmad3によって示唆された。)私の場合は、私は(actionmailerので使用mail宝石、から)Mail::Messageクラスにメソッドを追加しているので、私が作成:

    /lib/ext/mail/message.rb

  2. オープンクラスやモジュールとあなたのコードを追加します。

    module Mail class Message def to_is_phone? !!(self.to.first =~ /^\+1\d{10}$/) end end end

  3. すべてのサルのパッチをロードするinitalizerを作成します。 Railsは定数が参照されたときにファイルを自動読み込みしますが、新しいクラスを定義するのではなく既存のクラス/モジュールにメソッドを追加しているので動作しませんので手動ですべてのモンキーパッチを必要とします。だから私は、作成:

    /config/initializers/monkey_patches.rb

    含まれている:

    require 'ext/mail/message'

+0

私は現在Rails 4.1を使用していますが、これは古いバージョンでもうまくいくと思います。 – odigity

+3

'monkey_patches.rb'は' Dir [Rails.root.join( 'lib/ext/*。rb')]とすることができます。 require file} 'を実行し、すべてのサルパッチを取得します。 – dankohn

関連する問題