【问题标题】:LoadError: Unable to autoload constant in RailsLoadError:无法在 Rails 中自动加载常量
【发布时间】:2019-08-19 05:11:04
【问题描述】:

我正在运行一个Rails 应用程序。

app/workers/sample/fetch_book_report_worker.rb

class Sample::FetchBookReportWorker
 // body
end

app/workers/sample/fetch_student_report_worker.rb

class Sample::FetchStudentReportWorker
 // body
end

app/workers/sample/fetch_teacher_report_worker.rb

class Sample::FetchTeacherReportWorker
 // body
end

app/workers/sample/fetch_college_report_worker.rb

class Sample::FetchCollegeReportWorker
 // body
end

当我单独运行上述工作程序时,我没有发现问题。但是我同时运行所有的工人。我收到以下错误。

LoadError: Unable to autoload constant Sample::FetchStudentReportWorker, expected /home/ubuntu/my-app/app/workers/sample/fetch_student_report_worker.rb to define it

如何解决?

【问题讨论】:

  • 你能把代码放在你调用这些类的地方吗?
  • @barmic 现在,我正在从 Rails 控制台呼叫工作人员?最初它会被安排在任何时候使用 gem
  • @Galet,你能发布一个用于从控制台运行所有工作人员的命令吗?
  • 我同时在 Rails 控制台中调用工作人员,如下所示。示例::FetchBookReportWorker.perform_async 示例::FetchStudentReportWorker.perform_async 示例::FetchTeacherReportWorker.perform_async 示例::FetchCollegeReportWorker.perform_async
  • 你有定义Sample模块的app/workers/sample.rb吗?

标签: ruby-on-rails


【解决方案1】:

你可以看到 autoload_paths 来输入这个命令。

bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'

如果看不到 .../app/workers/sample,请在 config/application.rb 中添加 autoload_paths

config.autoload_paths << Rails.root.join("app/workers/sample")

如果它可能导致生产模式出现问题,请使用“eager_load_paths”

来自https://guides.rubyonrails.org/autoloading_and_reloading_constants.html的参考

【讨论】:

  • 因为错误说:“预期 /home/ubuntu/my-app/app/workers/sample/fetch_student_report_worker.rb 来定义它”这并不意味着它已经在自动加载路径中,但是它在那里找不到它,因此我担心文件名不正确。
  • @Galet 你能在加载常量 Sample::FetchStudentReportWorker 时给我看一部分代码吗?
  • @Brad 我同时在如下所示的 Rails 控制台中呼叫工作人员。示例::FetchBookReportWorker.perform_async 示例::FetchStudentReportWorker.perform_async 示例::FetchTeacherReportWorker.perform_async 示例::FetchCollegeReportWorker.perform_async
  • 也许春天有问题。 $ bin/spring stop 和 rails console 然后再次运行。在 sidekiq wiki 中,“注意:如果您在 Rails 控制台中对此进行测试并且使用 spring,则可能需要停止 spring,以便您可以访问新的 worker。”
  • @ogelacinyc 我已经检查过了。春天没有运行。
【解决方案2】:

LoadError error 的一个可能根本原因是,从 Rails 5.2.0 开始,自动加载发生了变化,需要(至少)定义子模块(命名空间)(作为常量)。

在原始帖子的示例中,module Sample 应在app/workers/sample.rb 文件中定义(如上面 Vasfed 所述)。

请参阅此related SO answer 了解更多详情。

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 2019-03-14
    • 1970-01-01
    • 2016-04-13
    • 2020-03-31
    • 1970-01-01
    • 2017-10-22
    • 2014-05-11
    • 2016-04-18
    相关资源
    最近更新 更多