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