Rails:从控制器中的lib文件夹加载自定义类

时间:2017-11-05 08:44:05

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

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

4 个答案:

答案 0 :(得分:10)

Ruby on Rails具有某些支持自动加载的命名约定。

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

将您的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的更多信息。

答案 1 :(得分:2)

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

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

如果您希望“手动”执行此操作,则只能在同一文件中要求此类文件:

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

此后需要重启。

答案 2 :(得分: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/**/"]

rails 3

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

答案 3 :(得分:0)

将此添加到您的应用程序中。rb

values = np.where(df.eq(1), df.columns, df)
df = pd.DataFrame(values, columns=df.columns)

     0  1  2  3  4  5
0  abc  0  2  0  0  5
1  bcd  0  0  3  0  0
2  def  0  0  0  4  0