【问题标题】:Rails Autoloading Nested Class: LoadError (Unable to autoload constant ModuleName::ClassName)Rails 自动加载嵌套类:LoadError(无法自动加载常量 ModuleName::ClassName)
【发布时间】:2020-03-31 15:32:42
【问题描述】:

我使用app/services 来组织服务类的集合。例如,我对 app/services/metrics/transaction.rb 中列出的 NewRelic 事务有一个轻量级包装器。

出于某种原因,Rails 自动加载很难做到这一点。我会收到不断的加载错误,例如:

LoadError (Unable to autoload constant Metrics::Transaction, expected /Users/home/company/repo-name/app/services/metrics/transaction.rb to define it)

当然,文件(和它的 3 个同级文件)是在列出的位置定义的。在急切加载常量的生产环境中,这不是问题。

路径在app 下,并且我检查了自动加载路径,因此应该加载文件,但是每当第一次命中常量时我都会遇到这个问题。

【问题讨论】:

    标签: ruby-on-rails activesupport ruby-on-rails-6


    【解决方案1】:

    这里的关键似乎是常量是嵌套的。似乎常量加载器首先尝试加载模块Metrics,但未能找到,发出错误。

    如果您在 app/services(或任何您对应的 app/* 自动加载目录)中创建一个定义模块常量的文件:

    # app/services/metrics.rb
    module Metrics
    end
    

    然后自动加载器将能够干净地加载在app/services/metrics/* 中定义的类。

    【讨论】:

    • 这个要求似乎从 Rails 5.2.0 开始强制执行。详情请参阅this SO answer
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2019-03-14
    • 2019-08-19
    • 2016-04-13
    • 1970-01-01
    • 2014-05-11
    • 2016-04-18
    • 2017-10-22
    相关资源
    最近更新 更多