ruby Rails:正在从控制器的lib文件夹加载定制类

o4tp2gmn  于 2023-01-08  发布在  Ruby
关注(0)|答案(4)|浏览(85)

我创建了一个文件,命名为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

2fjabf4q

2fjabf4q1#

Ruby on Rails需要遵循某些命名约定来支持自动加载。
如果模型/类结构是Services::MyService,那么Rails可以自动加载位于lib/services/my_service.rb的文件。
将您的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指南中阅读更多关于自动加载的信息。

ttp71kqs

ttp71kqs2#

您可能需要从lib/文件夹中的文件启用自动加载:

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

如果您更喜欢“手动”执行此操作,则只能在同一个文件中要求这样的文件:

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

在此之后,需要重新启动。

332nm8kg

332nm8kg3#

在config/application.rb中有一个设置,你可以在其中指定包含你想要自动加载的文件的目录。
从应用程序.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
xytpbqjk

xytpbqjk4#

将其添加到您的应用程序.rb中

config.eager_load_paths << Rails.root.join('lib/services')

相关问题