在Heroku上的lib目录中加载模块

时间:2011-05-20 16:38:27

标签: ruby-on-rails-3 heroku

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

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

然后我将模块包含在我需要它的模型中:

include SojournerSupport

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

有任何想法或建议吗?

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

include ::SojournerSupport

答案 2 :(得分:0)

除了获取更多信息之外,解决方案并非如此,但您是否尝试使用本地计算机上的生产配置运行rails(使用rails s production)?

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

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

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

答案 3 :(得分:0)

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