我随机(看起来像)在我的localhost上得到一个nil.each错误。对代码感到非常自信,所以我把它推到了heroku,它在那里工作得很好。
这是我的观看代码:
<h2><%=@book.name.upcase%></h2>
<br />
<% @book.chapters.each do |chapter| %>
<h3>Chapter <%=chapter.number%></h3>
<% chapter.verses.each do |verse| %>
<b><%=verse.number%>)</b> <%=verse.body%>
<% end %>
<br /><br />
<% end %>
起初,我在控制器中的所有内容都是@book = Book.find(params[:id])
,除了速度之外,它的工作正常。然后我改为:
def show
if params[:book_name]
#@book = Book.find_by_sql(["select * from books where UPPER(name) = UPPER(?)", params[:book_name]]).first
@book = Book.where(["UPPER(name) = UPPER(?)", params[:book_name]]).includes(:chapters => :verses).first
raise ActiveRecord::RecordNotFound, "Page not found" if @book.nil?
elsif params[:id]
@book = Book.find(params[:id].to_i, :include => {:chapters => :verses})
end
end
现在我随机收到此错误:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
...
app/controllers/books_controller.rb:14:in `show'
一个区别是heroku使用postgre而我正在使用mysql
Heroku url:http://kjv-on-rails.heroku.com/books/1
完整的应用程序代码:https://github.com/tybro0103/KJV-on-Rails
更新 我刚检查完全跟踪并意识到错误发生在这里:
mysql2(0.2.6) LIB / active_record / connection_adapters / mysql2_adapter.rb:635:在 `select'
因此错误发生在mysql2 gem中。
注意 我注意到我有奇/冗余的关系&amp;数据。我意识到这一点,我保证!我不相信这会导致错误。 :)
注意 随意这里是我的意思...在一些书籍上我从来没有看到这个错误。在其他人看来,我看到90%的时间,而在其他人看来,我看到了50%的时间。我只是一遍又一遍地刷新,有时它可以工作,有时它不会。我想真正明白我的意思的唯一方法就是自己下载代码。我的猜测是没有人会这意味着我会在几天内作为奖励开始赏金。 :)
更新
所以错误发生在mysql2适配器中。有趣的是@book = Book.find(params[:id].to_i, :include => {:chapters => :verses})
在运行rails服务器时导致错误。在rails控制台中,我可以整天运行相同的命令,它工作正常。它使用webrick,但我尝试切换到mongrel并得到了同样的错误。我也试过从ruby 1.8.7切换到1.9.2并得到同样的错误。似乎可能在rails服务器中存在某种内存限制?
答案 0 :(得分:0)
AHHHH ......我找到了麻烦制造者!我只是将mysql从5.5降级到5.1 ......问题一去不复返了! @ $$是多么痛苦。
然而,能够使用最新版本的mysql仍然会很好。如果有人能找到一种方法让它使用mysql 5.5,我会将其标记为已接受的答案。