我只是将我的本地Rails 4应用程序推送到Heroku,我有一个奇怪的错误。通常情况下,它在本地工作正常,没有问题。我认为Heroku数据库/环境基本上与本地相同(据我所知!)
Heroku日志中的错误是:ActionView::Template::Error (undefined method 'empty?' for nil:NilClass)
它试图判断某个关联是否为empty
- 如果empty
显示无结果部分 - 如果它不是empty
则会循环显示结果并显示结果部分为每个。
控制器:
@polls = Poll.where('team_id = ? AND expires_at >= ?', params['id'], DateTime.now())
查看:
<% if @polls.empty? %>
<%= render partial: "noresults" %>
<% else %>
<% @polls.each do |p| %>
<%= render partial: "poll", locals: {poll: p} %>
<% end %>
<% end %>
我打开了一个Heroku控制台并运行了@polls
查询,该查询返回了一个正确的关联,我可以使用empty?
进行测试,并且它按预期工作。
有什么想法会导致这种情况吗?
编辑:
的database.yml
production:
adapter: postgresql
encoding: unicode
pool: 5
答案 0 :(得分:0)
数据强>
你遇到的问题是你在一个尚未设置的变量/数据对象上调用.empty?
当您部署到其他环境时,这是一个标准问题,因为它没有您在开发中填充的数据。这可能是由于您的production
数据库未被填充(没有记录),或者您实际上没有连接生产数据库(不太可能)
要解决此问题,您要么确保设置polls
,要么在if
声明中添加其他条件:
<% if !@polls.present? || @polls.empty? %>
<%= render partial: "noresults" %>
<% else %>
...
<% end %>
<强>原因强>
最重要的原因是您的变量不会被填充,导致您的应用程序无法调用您需要的方法。这是Rails应用程序的标准问题(不仅仅是在Heroku上运行的应用程序)
要解决它,您基本上需要验证对象是否存在。一种方法是使用我在上面概述的条件方法,或者您可以使用.blank?
建议的Niall