Time_ago_in_words无效

时间:2015-03-08 20:02:53

标签: ruby-on-rails ruby ruby-on-rails-4 erb

我遇到了一个奇怪的问题。在我的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`

2 个答案:

答案 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

请参阅time_ago_in_words

的Rails文档

错误显示在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