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

Rails.application.routes.url_helpers crashing Heroku app

我正在构建一个 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 个原因造成的:

首先,在 class 常量中使用 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 class 时动态 url 帮助程序尚未注册。

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

Craig 的回答是正确的。所以,因为在 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 的魅力一样……当然我花了太长时间才弄明白! ;)