2012-03-19 8 views
1

Rails 3.2.2とRuby 1.9.2の使用。開発環境のリロードを使用して、マウント可能なエンジンのモデルを別のマウント可能なエンジンに拡張する方法

UserクラスがActiveRecord::Baseのクラスを継承していると宣言するレール搭載エンジンEngineAがあります。私はEngineA::Userに機能を注入したい別のエンジンEngineBを持っています。今私がやったことは以下の通りである:

方法1:

#EngineA app/models/engine_a/user.rb 
module EngineA 
    class User < ActiveRecord::Base 
    has_attached_file :avatar 
    has_many :somethings 
    end 
end 

#EngineB lib/engine_b/user.rb 
module EngineB 
    module User 
    def self.extended obj 
     obj.class_eval do 
     has_many :something_elses 
     end 
    end 
    end 
end 

EngineA::User.extend EngineB::User 

これは私にuninitialized constant EngineA::Userエラーになります。その特定のファイルが必要な場合でも、私はhas_attached_fileが理解できるように、EngineAのペーパークリップを必要とする問題にぶつかります。その道路は、私がEngineAEngineBの中の依存関係を知り、必要とする必要があることを認識したときに終わった。

方法2:

私はEngineB user.rbファイルから最後の行EngineA::User.extend EngineB::Userを除去する以外は前と同じコードを使用します。その後、その呼び出しをEngineBのイニシャライザに移動しました。

#EngineB config/initializers/my_mixin.rb 
EngineA::User.extend EngineB::User 

これは完全に機能しました!開発モードを除いて、コードを変更するとモデルが更新されます。リフレッシュされた唯一のものはEngineA::Userであり、私がイニシャライザとして入れたミックスインではありません。だから私はコードを変更した後、私はすべての私の拡張機能を失った。

私はこれを行う最も効率的な方法ですが、これは肯定的ではありません。どんな助けでも大歓迎です。前もって感謝します。

答えて

2

configuration documentationによれば、ActionDispatchコールバックを使用してアイテムを読み込むことができます。これらのコールバックは、開発モードの場合と同様に、すべての要求でcache_classesがfalseに設定されている場合に実行されます。あなたのEngineB.rbファイルの内部

、あなたはこのような何か試してみてください:

if Rails.env.development? 
    ActionDispatch::Callbacks.to_prepare do 
     load "#{File.expand_path(File.dirname(__FILE__))}/../config/initializers/my_mixin.rb" 
    end 
end 
+0

素晴らしいが...完全に動作します!ありがとう! – philt5252

関連する問題