【问题标题】:Loading modules in the lib directory on Heroku在 Heroku 上的 lib 目录中加载模块
【发布时间】:2011-08-29 19:44:46
【问题描述】:

我在 rails 3 项目的 lib 目录中有一个名为 slot.rb 的文件。它创建了一个名为 SojournerSupport 的模块,并包含一个名为 Slot 的类。我有以下我的 config/application.rb 文件:

config.autoload_paths += %W(#{config.root}/lib)

然后我将模块包含在我需要的模型中,如下所示:

include SojournerSupport

这在我的机器上本地运行良好,但是当尝试在 heroku 中运行应用程序时,它显示“未初始化的常量 ShipRecord::SojournerSupport (NameError)”ShipRecord 是我包含该模块的模型的名称。

有什么想法或建议吗?

【问题讨论】:

    标签: ruby-on-rails-3 heroku


    【解决方案1】:

    如果SojounerSupport 是顶级类或模块,那么您可能需要在包含它时明确声明它是这样的。

    include ::SojournerSupport
    

    【讨论】:

    • 感谢您的建议,但还是不行。在运行我的测试时也遇到了这个问题。
    【解决方案2】:

    与其说是一种解决方案,不如说是一种获取更多信息的方法,但您是否尝试过从本地机器上使用生产配置运行 rails(使用 rails s production)?

    如果你在那里遇到同样的问题,我会调查你的 production.rb 文件,看看它是否对你的自动加载路径做了什么奇怪的事情。

    您还可以将控制台加载到您的生产环境(或 heroku 控制台),并检查您的 Application.config 以确保加载路径符合您的预期。

    最后,当我看到不一致的 Heroku/dev 行为时,我首先检查的一件事是确保我使用的是匹配版本的 ruby​​。 Heroku 仍然是或最近使用 1.8.7 作为默认版本。

    【讨论】:

    • 请注意,我是rails s -e production
    【解决方案3】:

    实际上设法找出解决方案。我不确定为什么 heroku 在索引页面上崩溃了,但是当我点击一个使用模型拉入库模块的控制器时,它也会给我错误。似乎 config.autoload_paths 期望文件名与模块名相同(如此处所述:Rails 3 library not loading until require)。我像这样重命名了 lib 目录中的文件名,现在它在本地工作。我回家后会推到heroku,但我认为这解决了问题:)。

    【讨论】:

      【解决方案4】:

      让我的模块在 Heroku 上运行时遇到了类似的问题。除了自动加载命名约定之外,我发现模块代码必须是必需的,因为 Rails 在 Heroku 上的生产环境做出了线程安全假设(即使它在我的 production.rb 文件中被注释掉了)。我在调用模块上的“include”之前“需要”模块文件,一切都开始工作了。

      请查看这篇关于在 Heroku 中正确加载模块的优秀文章:

      http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/

      【讨论】:

      • 这很有趣。我知道要求您的 lib 文件并使用我上面所说的配置通常是一个坏主意。浏览您链接的文章后,听起来想法是保持命名约定,或者像您一样手动要求它。
      • 我首先尝试过,但不幸的是,命名约定对我不起作用——一旦我推送到 Heroku,事情就严重崩溃了。从来没有真正弄清楚为什么,但“要求”挽救了一天。你能告诉我为什么需要 lib 文件是一个坏主意吗?使用这种方法会遇到什么潜伏的东西吗?
      • 是的,这是有原因的:stackoverflow.com/questions/3356742/…。如果您阅读建议使用 require 的答案下方的评论,它表示要求文件会阻止 ActiveSupport::Dependencies 卸载代码。
      • 感谢您的指点。说得通。我会询问 Heroku 的人,看看他们的环境中的线程安全/要求有什么问题。
      猜你喜欢
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多