2016-01-21 64 views
1
<% if post.created_at < 30.days.ago %> 
    <%= post.created_at.strftime("%b %d, %Y") %> 
<% else %> 
    <%= time_ago_in_words(post.created_at) %> 
<% end%> 

该帖子创建时间不到30天,但第二个条件运行。这是安静的奇怪,当我改变第一行,并使其post.created_at > 30.days.ago它返回第一个条件,即使它是错误的,因为创建的帖子要早得多。Rails时间很奇怪

请如果有人可以解释为什么是这样,我该怎么做才能改变它(如果有的话)。

+0

@MrYoshiji它没有改变任何东西。输出仍然是一样的。 –

回答

1

这个代码是有意义的英文:

post.created_at < 30.days.ago 

你的大脑把它读成:

如果这个帖子被创建不到30天前...

但是,红宝石将其读为:

如果这个帖子被创建的日期小于(前)之日起30天前...

记住30.days.ago返回datetime,而不是时间。假设post.created_at是两周前的,即2016-01-06(实际上它是DateTime,但为了演示我们将忽略时间)。两周不到30天,所以你可能会期望你的表情评估为true。但是,30.days.ago返回日期2015-12-22。把这些值转换成我们的表达(现伪代码):

2016-01-06 < 2015-12-22 

这个计算结果为false,因为左边的日期是前(阅读:不小于)右侧的日期。

为了测试post.created_at是否是后(读:大于)30.days.ago,我们必须扭转操作:

if post.created_at > 30.days.ago 

附:另一种考虑的方式是30天前的日期是否在(小于)post.created_at之前。这基本上(如果不完全)等同:

if post.created_at > (DateTime.now - 30.days) 

或者你可以考虑post.created_at是否30.days.ago与今天:

if post.created_at.between?(30.days.ago, DateTime.now) 

或者,由于post.created_at经过的时间是否少于30天:

if (DateTime.now - post.created_at) < 30.days 

(请注意,而30.days.ago返回datetime,30.days返回durati )

+0

感谢大脑真的很困惑 –

1

我认为你误解了你的情况是如何工作的。

在这种情况下,如果语句成功,如果date_1date_2前:

if date_1 < date_2 
    # do something 
end 

在你的代码,如果要是柱前在30天前创建语句成功。

你可能想要的是在30天之前?

+0

第一个条件说'如果post.created_at <30.days.ago'这个帖子是在30天前创建的,但是这个代码不会运行else代码。 –

+0

这不是病情说的。正如Jon解释的那样,post.created_at应该在30天前定义的时间之前(<),即该帖子是在30天前创建的。 –