【问题标题】:Rails: Loading custom class from lib folder in controllerRails:从控制器中的 lib 文件夹加载自定义类
【发布时间】:2017-11-05 08:44:04
【问题描述】:

我创建了一个 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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5


    【解决方案1】:

    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 指南中阅读有关 autoloading 的更多信息。

    【讨论】:

    • 这解决了它而无需明确要求。谢谢你。
    • 我遇到了同样的问题,但在更新application.rb 并重新启动服务器后不需要Services::MyService.new。我可以使用控制器中的MyService.new() 访问我的自定义类。
    【解决方案2】:

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

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

    如果你更喜欢“手动”,那么你只能在同一个文件中要求这样的文件:

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

    在此之后需要重新启动。

    【讨论】:

    • 已经尝试过自动加载它。仍然得到未初始化的常量 MyController::MyService
    • 尝试使用require './lib/my_service' 并重新启动您的服务器。
    • 似乎要求语句开头的点修复了它。谢谢!
    【解决方案3】:

    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 
    

    【讨论】:

      【解决方案4】:

      在你的 application.rb 中添加这个

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-19
        • 2011-03-22
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        相关资源
        最近更新 更多