【问题标题】:Rails, production-env, "Object is not missing constant"Rails,生产环境,“对象不缺少常量”
【发布时间】:2010-10-30 01:44:11
【问题描述】:

所以我似乎很愚蠢并且很长时间没有检查在生产环境中的运行情况,现在我正在尝试部署,我收到了这个烦人的错误。有什么想法吗?

lib/history_tools.rb

module HistoryTools
  def self.included(base)
    base.has_many :history, :dependent => :destroy
    History::TYPES.each do |htype|
      base.has_many "history_#{htype}", :class_name => "History::#{htype.capitalize}"
    end
  end
  # ... other minor things removed ...
end

app/models/user.rb

class User < InheritedResources::Base
  include HistoryTools
end

config/environment.rb

# ... the usual stuff, then, at the very bottom:
require 'history_tools'

这给出了错误:

activesupport-2.3.8/lib/active_support/dependencies.rb:417:in
`load_missing_constant':ArgumentError: Object is not missing
 constant HistoryTools!

如果我在 user.rb 的顶部添加一个额外的 require 'history_tools',它会修复 那个 错误,我相信,但是它无法在 #{RAILS_ROOT}/lib 中找到其他需要的东西在 environment.rb 中以相同的方式。

踢球者:这在开发模式下完美运行。它只会在生产中给出这个错误。我的大部分谷歌搜索似乎表明“不丢失常量”错误与 Rails 如何自动加载文件有关,当没有卸载任何内容时,这些文件应该在生产中消失。这似乎与那种行为相反?

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

当我收到此错误时,这是​​因为错误中提到的类/模块内部的内部类/模块中存在错误。

【讨论】:

    【解决方案2】:

    我不能说这是一个错字还是真实的代码,但是:

    class User < InheritedResources::Base
      include HistoryTools
    end
    

    应该是

    class User < ActiveRecord::Base
      include HistoryTools
    end
    

    InheritedResources 应该用于控制器,而不是模型。

    【讨论】:

    • 你是对的,当然。我最近写了太多控制器,并且出于习惯而打字... sigh
    【解决方案3】:

    你不应该在 environment.rb 中有 require 'history_tools'。在那个版本的 Rails 中,lib 文件夹中的所有文件都应该自动加载。

    【讨论】:

      【解决方案4】:

      好的,经过更多小时的挖掘,似乎它甚至与这些东西无关。这是一个关于树下另外 3 个类的错误,由于另一个奇怪的原因而失败,并且该异常显然被某个地方的 rails 内部捕获并被忽略了。

      不幸的是,这并不能解释为什么它可以在开发模式下工作,但至少我所有的东西现在都可以工作了。还是谢谢!

      【讨论】:

      • 它可能在开发模式下工作,因为你没有访问那个有错误的类。当您在生产模式下启动服务器时,它会预加载所有类,因此错误会变得更加明显。
      猜你喜欢
      • 1970-01-01
      • 2016-01-12
      • 2014-06-23
      • 2016-11-05
      • 2014-10-15
      • 2021-08-10
      • 2014-06-04
      • 2011-12-18
      相关资源
      最近更新 更多