web-dev-qa-db-ja.com

Rails:コントローラのlibフォルダからカスタムクラスをロードする

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を取得しています

11
nao

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 の詳細をご覧ください。

18
spickermann

おそらく、lib/フォルダー内のファイルからオートロードを有効にする必要があります。

# config/application.rb
config.autoload_paths << "#{Rails.root}/lib"

「手動」で実行したい場合は、同じファイルでそのようなファイルのみを要求できます。

# config/application.rb
require './lib/my_service'

この後、再起動が必要です。

3
Sebastian Palma

オートロードしたいファイルを含むディレクトリを指定できる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 
1