ruby on rails 3-在Heroku上的lib目录中加载模块



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

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

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

include SojournerSupport

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

有什么想法或建议吗?

我在让模块在Heroku上运行时也遇到了类似的问题。除了自动加载命名约定之外,我发现模块代码必须是必需的,因为Rails在Heroku上的生产环境做出了线程安全的假设(尽管它在我的production.rb文件中被注释掉了。

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

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

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

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

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

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

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

include ::SojournerSupport

实际上设法找到了解决方案。我不知道heroku为什么在索引页崩溃,但当我遇到一个使用模型拉入库模块的控制器时,它也会给我错误。config.autoload_path似乎希望文件名与模块名称相同(如这里所述:Rails3库在需要之前不会加载)。我将lib目录中的文件名重命名为这样,现在它可以在本地工作了。我回家后会推给heroku,但我认为这解决了问题:)。

相关内容

  • 没有找到相关文章

最新更新