Rails 6自动加载无法找到类

5

我试图将Rails 5升级到6。我已经完成了升级步骤,包括添加以下内容:

# config/application.rb
config.load_defaults 6.0

我有这个类:

# lib/notification/auto_thank.rb
module Notification
  class AutoThank
    def perform
      # stuff
    end
  end
end

用于任务中的:

namespace :notify do
  task auto_thank: :environment do
    Notification::AutoThank.new.perform
  end
end

当我运行puts config.autoload_paths时,我的目标是让它自动加载:/my/app/path/lib/notification/auto_thank.rb,但当我运行任务时,我会遇到一个错误:NameError: uninitialized constant Notification。更奇怪的是,当我在任务中添加require后,情况变得更糟了。
task auto_thank: :environment do
  require '/my/app/path/lib/notification/auto_thank.rb'
  Notification::AutoThank.new.perform
end

我收到了一个不同的错误:

NameError: 预期文件/my/app/path/lib/notification/auto_thank.rb定义常量AutoThank,但没有定义

我缺少什么?

1个回答

2
如果可以的话,请将自动加载代码放在app/中。从Rails 6开始,其中的所有内容都将自动成为自动加载路径的一部分。Rails 5则更具有选择性。
在本例中,将其称为:app/notifications/notification/auto_thank.rb 路径的第一部分将被忽略。第二个(可选)部分是名称空间。
请注意,要使它出现在自动加载器中,您可能需要使用spring stop停止Spring进程。每次引入新的app/...路径时都必须这样做。

我认为同样的问题也会发生在 lib 中的所有内容上。我不认为我想把整个 lib 移动到 app 中。肯定有一种方法可以从 lib 中自动加载,对吧? - Tim Scott
1
你可以将它添加到自动加载路径中,但最好的方法是将其放入 app/ 目录下。旧的 lib/ 方法很快就会被弃用,并且存在问题(参见:https://dev59.com/_1oT5IYBdhLWcg3wxxok)。 - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接