2016-02-05 57 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 %> - 因子时区