我遇到了一个奇怪的问题。在我的rails应用程序中,执行:time_ago_in_words homework.created_at
返回错误:
undefined method `>' for nil:NilClass
上下文:
<h3 class="media-heading"><%= homework.title %></h3>
<p>Assigned <%= time_ago_in_words homework.created_at %> ago</p>
created_at已定义,此迁移t.timestamps null: false
(是的,我已运行它),它位于数据库中。
取出第二行后,标题就可以了。
homework.created_at
会返回:2015-03-08 13:45:11 -0500
跟踪:
app/views/homeworks/_homework.html.erb:6:in `_app_views_homeworks__homework_html_erb__2140072314140949314_70221661493300'
app/views/welcome/home.html.erb:26:in `block in _app_views_welcome_home_html_erb__3498543795407979710_70221651392200'
app/views/welcome/home.html.erb:24:in `_app_views_welcome_home_html_erb__3498543795407979710_70221651392200'
app/controllers/welcome_controller.rb:7:in `index'
homework.created_at.to_time
错误:undefined method
to_time'代表nil:NilClass`
答案 0 :(得分:3)
试试这个:
<%= time_ago_in_words(homework.created_at) unless homework.created_at.blank? %>
答案 1 :(得分:1)
错误是说你在时间计算中有一个零值:
undefined method `>' for nil:NilClass
您使用的方法会比较两次:
from_time
- 这来自您的参数,即created_at
to_time
- 这是Rails自动使用Time.now
。错误显示在Rails堆栈中,from_time
为零。
可能的原因是created_at
为零。
此原因与您发布的第二个错误一致:
homework.created_at.to_time #=>
undefined method to_time' for nil:NilClass`
也许你还没有保存过这个对象,或者created_at
以某种方式被消灭了,或者渲染的对象与你期望的有什么不同?
如果您的目标是能够显示新对象或创建的对象,那么解决此问题的一种方法是添加if..then..else
,例如:
<% if homework.created_at %>
<p>Assigned <%= time_ago_in_words homework.created_at %> ago</p>
<% else %>
<p>Not Yet Assigned</p>
<% end %>
或者,如果你的目标是始终有created_at
时间,那么解决它的一种方法是明确设置时间(并准备让Rails覆盖它),例如:
<% homework.created_at ||= Time.now %>
或者,保存对象,例如:
<% homework.save! %>
(在我看来,最好在控制器中执行save!
,而不是视图)
编辑...你写道“我保存了对象(使用RubyMine验证),而created_at不是零。”
这令人惊讶!你可以看到你渲染的对象是否与你想象的不同,比如添加这个ERB:
<!--
Homework
id:<%= homework.id %>
created_at:<%= homework.created_at %>
-->
或者这些例外:
<% homework.id or raise "error in homework id" %>
<% homework.created_at or raise "error in homework created_at" %>
您可以通过绕过它来排除time_ago_in_words
方法的任何问题,并直接转到更深层次的Rails方法:
<%= distance_of_time_in_words(homework.created_at, Time.now) %>
除此之外的任何错误都可能是由于事故造成的恕我直言(即ERB未以典型方式呈现,由于您的代码中超出此特定问题的某些意外)或缓存(即ERB呈现缓存对象) ,或以某种方式呈现不同于您期望的环境或对象。
在你的再培训局中试试这个:
<%= logger.debug("homework id:#{homework.id}" %>
<%= logger.debug("homework created_at:#{homework.created_at}" %>
然后查看您的日志文件,您可能会看到一些不对劲的内容,例如id
与您的预期不匹配和/或nil
,或{ {1}} created_at
,或某种缓存问题,显示整个ERB文件有异常和/或没有按预期方式运行。
此外,尝试检测ERB发送nil
变量的错误。例如,如果您使用的控制器设置homework
变量,并使用具有典型控制器实例变量的更高级别的ERB,则调用ERB部分,尝试将其添加到更高级别的ERB因此,您可以验证控制器是否正在发送您想要的正确@homework
:
@homework