2017-01-15 5 views
0

Railsの自動ロードが開発/テスト環境でどのように機能するかに関する問題が発生しました。私が達成しようとしているのは、親クラスのプラグイン可能な実装の一種であり、アプリケーションの起動時に変更できます。より詳細には、私は、次のアイデアをクラスMeasureを実装している:Railsオートローディング:テスト間で定数が失われる、または循環依存が導入される

# app/models/measure.rb 
class Measure 

    attr_reader :implementations 

    def self.register(klass) 
    @implementations << klass 
    end 

    def self.from(raw_value) 
    # ... find a suitable implementation and instantiate it 
    end 

    # ... 
end 

そして私は、次のような異なるMeasuresの実装があります。これらは、その後、このような呼び出しを使用して設定する必要があります

# app/models/measures/grams.rb 
module Measures 
    class Grams < Measure 
    # ... code to tell Measures if this class can be 
    # instantiated from a given raw value 
    end 
end 

Measure.register(Measures::Grams)となります。

問題は、私がイニシャライザでこれを行うと、定数のキャッシュが明らかにパージされるため、テストの実行間に測定の実装が失われることです。つまり、有効なはずのMeasure.from("2 grams")などのコールは、Measure.implementationsにはMeasures::Gramsが含まれていないため、機能しなくなります。一方、app/models/measure.rbrequire_dependencyを追加すると、登録を行うコードを参照して、RailsがMeasureクラスをロードする前に、実装の1つを参照するときに循環依存性があります。 Railsがオートローディングをどのようにしているのかを少しだけ調べて読んだところ、私は満足のいく解決策を思いつきませんでした。

私の質問は次のとおりです。この階層は、Railsがコードを自動ロードする方法とうまくやるように設定する必要がありますか?

答えて

0

MeasureベースクラスからMeasuresモジュールに登録された実装を追跡する責任を移し、モジュールが定義されているのと同じファイルで登録を行う方法を見つけたようです。より健全な建築的選択が好きなように思えます。残されたことは、名前を「s」以上のものと区別することだけです。

関連する問題