Lib/services/my_service.rbとしてファイルを作成しました。
# /lib/services/my_service.rb
class MyService
...
end
App/controllers/my_controllerで使用したい
class MyController < ApplicationController
def method
service = MyService.new()
end
MyServiceが初期化されていない定数であるというエラーが発生します。私はそれをインポートしようとしました
require '/lib/services/my_service.rb'
しかし、私は得ています
cannot load such file -- /lib/services/my_service.rb
編集:私はapplication.rbからオートロードを使用してみました
config.autoload_paths << Rails.root.join('lib')
しかし、サイコロはありません。まだ初期化されていない定数MyController :: MyServiceを取得しています
Ruby on Railsは、オートローディングをサポートする特定の命名規則を想定しています。
Railsは、モデル/クラス構造がlib/services/my_service.rb
の場合、Services::MyService
にあるファイルを自動ロードできます。
lib/services/my_service.rb
を次のように変更します。
module Services
class MyService
# ...
end
end
そして、あなたのコントローラーでこのようなクラスを使用してください:
service = Services::MyService.new
Ruby on Railsバージョンによっては、オートロードするファイルを検索するときに照会されるフォルダーのリストにlib
フォルダーを追加する必要がある場合があります。 :
# add this line to your config/application.rb:
config.autoload_paths << "#{Rails.root}/lib"
Railsガイドで autoloading の詳細をご覧ください。
おそらく、lib/
フォルダー内のファイルからオートロードを有効にする必要があります。
# config/application.rb
config.autoload_paths << "#{Rails.root}/lib"
「手動」で実行したい場合は、同じファイルでそのようなファイルのみを要求できます。
# config/application.rb
require './lib/my_service'
この後、再起動が必要です。
オートロードしたいファイルを含むディレクトリを指定できるconfig/application.rbの設定があります。
Application.rbから:
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
または
config.autoload_paths += Dir["#{config.root}/lib/**/"]
Rails 3
Dir["lib/**/*.rb"].each do |path|
require_dependency path
end