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

Rails有一些命名约定来支持自动加载。

如果模型/类结构是Services::MyService则Rails会自动加载位于lib/services/my_service.rb的文件。

将您的lib/services/my_service.rb更改为:

 module Services class MyService # ... end end 

并在您的控制器中使用这样的类:

 service = Services::MyService.new 

请注意,根据您的Rails版本,您可能需要将lib文件夹添加到自动加载文件时使用的文件夹列表:

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

阅读Rails指南中有关自动加载的更多信息。

您可能需要从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/**/"] 

铁轨3

 Dir["lib/**/*.rb"].each do |path| require_dependency path end