2017-11-05 8 views
0

ファイルをlib/services/my_service.rbとして作成しました。私はアプリ/コントローラ/ my_controllerRails:コントローラのlibフォルダからカスタムクラスをロードする

class MyController < ApplicationController 
    def method 
      service = MyService.new() 
    end 

でそれを使用したい

# /lib/services/my_service.rb 
class MyService 
... 
end 

私はMyServiceでは初期化されていない一定でエラーを取得しています。私は

require '/lib/services/my_service.rb' 

でそれをインポートしようとしたしかし、私は

cannot load such file -- /lib/services/my_service.rb 

編集を取得しています:私は

config.autoload_paths << Rails.root.join('lib') 

しかし、無サイコロを使用してapplication.rbからの自動読み込みを試してみました。まだ初期化されていない一定のMyControllerを取得:: MyServiceで

答えて

3

Railsには、オートロードをサポートするためのいくつかの命名規則があります。

モデル/クラス構造がServices::MyServiceの場合、Railsはlib/services/my_service.rbにあるファイルを自動ロードします。

service = Services::MyService.new 

あなたのRailsのバージョンに応じて、あなたがlibフォルダを追加する必要がある場合がありますのでご注意ください。

module Services 
    class MyService 
    # ... 
    end 
end 

そして、あなたのコントローラでは、このような、そのクラスを使用します。

はあなたの lib/services/my_service.rbに変更

ファイルの自動ロード時に使用されるフォルダの一覧:

# add this line to your config/application.rb: 
config.autoload_paths << "#{Rails.root}/lib" 

autoloadingについての詳細は、Railsガイドを参照してください。

+0

これは明示的に必要とせずに解決しました。ありがとうございました。 – JCDJulian

1

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

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

あなたが「手動」にそれを行うことを好む場合、あなたは、このようなだけを要求することができます同じファイルのファイル:

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

この後、再起動する必要があります。

+0

は、すでに自動ロードにそれを試してみました。まだ初期化されていない定数MyController :: MyService – JCDJulian

+0

'require '。/ lib/my_service''を試してから、サーバを再起動してください。 –

+1

requireステートメントの先頭にあるドットのように見えます。ありがとう! – JCDJulian

0

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/**/"] 

レール3

Dir["lib/**/*.rb"].each do |path| 
    require_dependency path 
end 
関連する問題