2016-01-21 96 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天前創建的。 –