我正在构建一个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。
谢谢。
答案 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.*_path
和Rails.application.routes.url_helpers.*_url
帮助程序。
在我的情况下,我试图在担忧中使用帮助者,并且遇到了同样的问题。这对我来说就像heroku的魅力一样......当然我花了太长时间来解决它! ;)