3

次のような、/ app/modelsの単一ファイルにあるいくつかの小さなクラスがあります。

# /app/models/little_class.rb
class LittleClass; ...do stuff; end;
class AnotherLittleClass; ...do stuff; end;

Railsは、クラス名を反映したファイルにクラスを自動ロードすることのみを目的としているようです。したがって、ファイルの外部でAnotherLittleClassを参照すると、LittleClassが参照されるまで、以下のように「単一化された定数」エラーが発生します。

irb(main):001:0> AnotherLittleClass 
NameError: uninitialized constant AnotherLittleClass
irb(main):02:0> LittleClass
=> LittleClass
irb(main):03:0> AnotherLittleClass
=> LittleClass2

それらを個々のファイルに分割するのは面倒で面倒です。これらのクラスを自動ロードする方法はありますか?LittleClassなしでAnotherLittleClassを参照しても、エラーは発生しませんか?

4

4 に答える 4

4

それらをモジュールに入れて、この名前空間内で使用することができますSomeLittleClasses::LittleClass.do_something

# /app/models/some_little_classes.rb
module SomeLittleClasses

  class LittleClass
    def self.do_something
      "Hello World!"
    end
  end

  class AnotherLittleClass
    def self.do_something
      "Hello World!"
    end
  end

end
于 2012-04-07T20:10:04.777 に答える
1

このトリックを試してください:

1.9.2p312 :001 > AnotherLittleClass.new
# => NameError: uninitialized constant AnotherLittleClass
1.9.2p312 :002 > autoload :AnotherLittleClass, File.dirname(__FILE__) + "/app/models/little_class.rb"
# => nil 
1.9.2p312 :003 > AnotherLittleClass.new
# => #<AnotherLittleClass:0xa687d24> 
于 2012-04-07T20:04:21.730 に答える
1

私が見るように、これらはあなたの選択です:

  1. ファイルをクラスごとに1つのファイルに分割し、railsの規則に従って名前が付けられたディレクトリ(SomeClass=> some_class.rb)に配置し、起動ファイル(たとえば、でファイルを作成config/initializers)に配置します。

    autoload_paths Rails.application.config.root + "/path/to/lib"
    
  2. 次のようなものをスタートアップファイルに追加します。

    %W[
        Class1 Class2
        Class3 Class4 Class4
    ].map(&:to_sym).each dp |klass|
        autoload klass,Rails.application.config.root + "/path/to/lib/file"
    end
    

    もちろん、これは新しいクラスがファイルに追加されるたびに更新する必要があります。

  3. すべてのクラスをモジュール/クラス名前空間に移動し、autoload上記のように呼び出して追加します

  4. を使用して、ファイル全体をスタートアップファイルに事前にロードするだけですrequire。自問してみてください:余分な努力は、このファイルのロードを遅らせることを保証しますか?

于 2012-04-08T13:35:58.937 に答える
0

次のファイルapp/models/statistic.rbが与えられます:

class Statistic
  # some model code here
end

class UsersStatistic < Statistic; end
class CommentsStatistic < Statistic; end
class ConnectionsStatistic < Statistic; end

ファイルconfig/initializers/autoload_classes.rbを作成し、次のコードを追加します。

# Autoloading subclasses that are in the same file


# This is the normal way to load single classes
#
# autoload :UsersStatistic, 'statistic'
# autoload :CommentsStatistic, 'statistic'
# autoload :ConnectionsStatistic, 'statistic'


# This is the most dynamic way for production and development environment.
Statistic.subclasses.each do |klass|
  autoload klass.to_s.to_sym, 'statistic'
end



# This does the same but loads all subclasses automatically. 
# Useful only in production environment because every file-change 
# needs a restart of the rails server.
# 
# Statistic.subclasses
于 2015-08-10T14:19:57.767 に答える