Rails.application.routes.url_helpers崩溃Heroku应用程序

时间:2015-01-25 11:37:44

标签: ruby-on-rails ruby ruby-on-rails-4 heroku

我正在构建一个Serializer for Collection+Json,我正在编写一个API作为示例。我在Heroku上部署的应用上使用Rails.application.routes.url_helpers时遇到问题。

我在一个序列化器中使用它:

Rails.application.routes.url_helpers.bills_url

在开发过程中,一切正常。但是,在Heroku上,这会引发错误:

undefined method 'bills_url' for #<Module:0x007f3a1eab8d58> (NoMethodError)

如果我转储Rails.application.routes.url_helpers.methods,则不会列出任何_url_path方法。但是,如果我在控制台中运行相同的代码,它们就是:

heroku run rails c --app myapp
> Rails.application.routes.url_helpers.methods
> # => :bills_url is present

这很奇怪。这有什么线索吗? Heroku让url_helpers无效吗?我完全迷失了。我已经搜索了很多但没有发现任何内容。

这里是完整跟踪的bug report

谢谢。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,发现这是由于两个原因引起的:

首先,在类常量中使用Rails.application.routes.url_helpers方法,如下面的代码片段所示:

class myObject
  include ActiveModel::Model

  attr_accessor :id, :link

  DEFAULT_OBJECT = new id: 1, 
                     link: Rails.application.routes.url_helpers.my_object_url({:id => 1})

   ...
end

其次,在环境文件中设置config.eager_load = true

结果是,当config.eager_load = true时,加载myObject类时,动态网址助手没有被注册。

这篇文章可能很有用 - &gt; http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/

答案 1 :(得分:1)

克雷格的回答是正确的。所以,因为在config/environments/production.rb我们有

config.eager_load = true

我们还需要添加以下内容:

config.before_eager_load do
  Rails.application.reload_routes!
end

现在,您的代码中的任何位置都应该能够使用Rails.application.routes.url_helpers.*_pathRails.application.routes.url_helpers.*_url帮助程序。

在我的情况下,我试图在担忧中使用帮助者,并且遇到了同样的问题。这对我来说就像heroku的魅力一样......当然我花了太长时间来解决它! ;)