8

私は次の設定をしています:

アプリ/モデル/my_module/service.rb

module MyModule
  class Service < ActiveRecord::Base
    def self.types
      self.subclasses
    end

    def self.raw_types
      self.types.map { |c| c.name.split("::").last }
    end
  end
end

require_dependency "my_module/service/rack"
require_dependency "my_module/service/rails"
require_dependency "my_module/service/sinatra"

アプリ/モデル/my_module/service/rack.rb:

module MyModule
  class Service::Rack < Service
  end
end

アプリ/モデル/my_module/service/rails.rb:

module MyModule
  class Service::Rails < Service
  end
end

アプリ/モデル/my_module/service/sinatra.rb:

module MyModule
  class Service::Sinatra < Service
  end
end

これまでのところうまくいきますが、今私の質問:

これらの 3 行を追加する必要がある理由:

require_dependency "my_module/service/rack"
require_dependency "my_module/service/rails"
require_dependency "my_module/service/sinatra"

私のservice.rbファイルに?

3行を追加しない場合:

MyModule::Service.raw_types
=> []

3行を追加すると:

MyModule::Service.raw_types
=> ["Rack", "Rails", "Sinatra"]

誰でもアイデアはありますか?

ところで:私はRuby 2.0.0-preview1、Rails 4.0.0.rc1を使用し、新しいRailsエンジンを作成します

rails plugin new MyModule
4

1 に答える 1

13

デフォルトでは、開発環境では、Rails はapp従来の場所 (たとえば/app/models/my_module/service/rack.rbfor MyModule::Service::Rack) を参照して、 の通常のサブディレクトリにある定数を自動読み込みします。このオートロードは、アプリの初期化時ではなく、定数が初めて参照されたときに発生します。

ただし、これは、定数が参照される前に、それを定義するファイルが明示的に必要でない限りロードされないことを意味します。

したがって、 を呼び出すとMyModule::Service.raw_types、まだ定義されていない場合MyModule::Serviceはロードされます。app/models/my_module/service.rbただし、そのサブクラスへの参照がまだ行われていない場合、それらを定義するファイルが明示的に必要でない限り、それらの定数は定義されません。したがって、そのメソッド呼び出しで自動ロードされるファイル内のそれらのファイルを要求すると、それらが使用可能になります

MyModule::Service道徳: のサブクラスが常に定義されていることを確認したい場合MyModule::Serviceは、それらを必須にする必要があります/app/models/my_module/service.rb

于 2013-05-15T17:35:02.167 に答える