2016-02-05 65 views
0

如何在Ruby on Rails中獲得當前年份?Ruby on Rails中的當前年份

我嘗試了各種東西,包括

  • Date.current.year
  • Time.now.year

的問題是它們返回的前一年情況下,一年的變化在啓動服務器之後(例如在新的一年之後)。

相關代碼:

型號brewery.rb創建一個新的啤酒廠時出現

class Brewery < ActiveRecord: :Base 
... 
validates :year, numericality: { only_integer: true, less_than_or_equal_to: Date.today.year } 
... 

問題,所以我認爲:每當這一行動發生Date.today.year將進行評估。

+0

你需要在一個ActiveRecord範圍,通過任何機會呢? –

+4

他們返回當前日期/時間。也許這是一個緩存問題,或者你在生產代碼中使用Timecop? – Stefan

+0

@ art-solopov是的,我需要它在一個ActiveRecord –

回答

9

在您的示例中,Date.today.year僅在被加載並且不再更改時才被評估一次。

當您在驗證聲明中使用的λ,它重新評估每個當它驗證該屬性的時間塊:

validates :year, numericality: { 
    only_integer: true, 
    less_than_or_equal_to: ->(_brewery){ Date.current.year } 
} 

此外,我建議使用Date.current代替Date.today,因爲current方法支付注意時區設置。

1

@ spickermann的食譜似乎是正確的,我只是試圖解釋它爲什麼起作用。

您在類中編寫的代碼在編譯時執行,當Ruby編譯爲VM字節碼時。因此,在編譯類時,驗證程序中的Date.today.year只計算一次。

通過引入lambda,您可以使ActiveRecord使用所述lambda的返回值。 lambda本身將在每次驗證時執行。

希望讓情況更加清晰!

1

<%= Time.zone.now.year %> - 因子時區