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 method
to_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
,或者 nil
的 created_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? %>
我遇到了一个奇怪的问题。在我的 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 method
to_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
,或者 nil
的 created_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? %>