Time_ago_in_words 不工作

Time_ago_in_words is not working

我遇到了一个奇怪的问题。在我的 rails 应用程序中,执行:time_ago_in_words homework.created_at returns 错误:

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(是的,我有 运行),并且它在数据库中。

当第二行被取出时,header起作用。

homework.created_at returns 这个: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 methodto_time' for nil:NilClass`

错误是说你在时间计算中有一个零值:

undefined method `>' for nil:NilClass

您使用的方法比较两次:

  • from_time -- 这来自您的参数,即 created_at
  • to_time -- 这是 Rails 自动使用 Time.now.

请参阅 Rails 文档 time_ago_in_words

错误显示在 Rails 堆栈中,您的 from_time 为 nil。

可能的原因是 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!

编辑...您写了 "I have saved the object (used RubyMine to verify), and created_at is not nil."

真令人惊讶!你可以看看你正在渲染的对象是否与你想象的不同,比如添加这个 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 正在呈现缓存的对象,或者以某种方式呈现与您预期不同的环境或对象)。

在您的 ERB 中试试这个:

<%= logger.debug("homework id:#{homework.id}" %>
<%= logger.debug("homework created_at:#{homework.created_at}" %>

然后查看您的日志文件,您可能会发现一些不对劲的地方,例如 id 与您的预期不符 and/or 是 nil ,或者 nilcreated_at,或者显示整个 ERB 文件有问题的某种缓存问题 and/or 不是您期望的 运行 方式。

此外,尝试检测任何 ERB 发送 homework 变量中的错误。例如,如果您正在使用设置 @homework 变量的控制器,并使用具有典型控制器实例变量的上级 ERB,然后调用您的 ERB 部分,请尝试将其添加到上级 ERB这样您就可以验证控制器是否发送了您想要的正确 @homework

<%= logger.debug("@homework id:#{@homework.id}" %>
<%= logger.debug("@homework created_at:#{@homework.created_at}" %>

试试这个:

<%= time_ago_in_words(homework.created_at) unless homework.created_at.blank? %>