3

このようなレールのセットアップがあります。

アプリ/サービス/TestService.rb

class TestService

  def self.doSomething
    return 'Hello World!'
  end

end

コントローラーでこのファイルを使用しています。

require 'TestService'

class IndexController < ApplicationController

  def index
    @message = TestService.doSomething
  end

end

また、これをconfigフォルダー内のapplication.rbに追加して、レールがサービスフォルダー内のクラスを自動ロードするようにしました。

config.autoload_paths += %W(#{config.root}/app/service)

しかし、アプリケーションは TestService クラスの更新を取得していないようです。サーバーを再起動せずに TestService クラスの変更が表示されるようにするにはどうすればよいですか。

4

2 に答える 2

2

require再ロード可能な定数を含むファイルをロードしようとするときは使用しないでください。

通常、その定数を使用できるようにするために特別なことをする必要はありません。定数を直接使用するだけで、require何も使用する必要はありません。

ただし、コードをきしむようにきれいにしたい場合は、これらのファイルをロードするために使用できる別のActiveSupport方法を提供します: .require_dependency

require_dependency 'test_service'

class IndexController < ApplicationController
  ...
end

きしむようにきれいになり、 ...TestServiceを含むファイルを明示的にロードするが、ApplicationController...を含むファイルを明示的にロードしないことは混乱を招きますが.

構成を変更する必要はありませんautoload_paths


更新 1

Rails が定数 (クラスとモジュール) を見つけてロードできるようにするには、次の手順を実行する必要があります。

アプリケーション内のすべてのリロード可能な定数が正しいファイル名のファイルにあることを確認する必要があります。ファイルは、またはまたはその他のサブディレクトリappなど、常に のサブディレクトリにある必要があります。定数の名前が の場合、ファイル名は で終わる必要があります。app/modelsapp/servicesTestServicetest_service.rb

アルゴリズムは次のとおり"TestService".underscore + ".rb" #=> "test_service.rb"です。

filename_glob = "app/*/" + the_constant.to_s.underscore + ".rb"

したがって、定数がTestServiceの場合、グロブはapp/*/test_service.rbです。したがって、後者は悪い形式ですが、定数を貼り付けることは、 app/services/test_service.rbwill と同様に機能します。app/models/test_service.rb定数が の場合SomeModule::SomeOtherModule::SomeClass、ファイルを に配置する必要がありますapp/*/some_module/some_other_module/some_class.rb

于 2012-10-21T05:26:49.407 に答える
0

あなたのファイルは にあると言っていますがapp/server、あなたは を自動ロードしていますapp/service。どちらが正しい?

ファイルの名前を に変更するapp/service/test_service.rbと、オートローダーが動作するはずです。Rails は、オートロード パスで snake_cased ファイル名を探します。requireオートローディングの動作が正しくなれば、マニュアルも必要ありません。

于 2012-10-21T05:14:54.077 に答える