Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails的本年度_Ruby On Rails_Ruby_Date - Fatal编程技术网

Ruby on rails RubyonRails的本年度

Ruby on rails RubyonRails的本年度,ruby-on-rails,ruby,date,Ruby On Rails,Ruby,Date,如何使用RubyonRails获得今年的成绩 我尝试了很多东西,包括 本年度日期 时间,现在,一年 问题是,如果在启动服务器后年份发生变化(例如新年之后),它们会返回上一年 相关代码: 模型酿酒厂.rb class Brewery < ActiveRecord: :Base ... validates :year, numericality: { only_integer: true, less_than_or_equal_to: Date.today.year } ... clas

如何使用RubyonRails获得今年的成绩

我尝试了很多东西,包括

  • 本年度日期
  • 时间,现在,一年
问题是,如果在启动服务器后年份发生变化(例如新年之后),它们会返回上一年

相关代码:

模型酿酒厂.rb

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

创建新酿酒厂时出现问题,因此我假设只要发生该操作,就会计算Date.today.year。

在您的示例中,Date.today.year
在加载类时只计算一次,因此以后不会更改

当您在验证器声明中使用lambda时,它会在每次运行该属性的验证时重新计算该块:

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

此外,我建议使用
Date.current
而不是
Date.today
,因为
current
方法注重时区设置。

实际上,最好使用
Time.current
而不是
Time.now
在Rails中,因为第一个方法采用当前时区。
@spickermann的食谱似乎是正确的,我将试着解释它为什么有效

当Ruby编译成VM字节码时,您在类中编写的代码在编译时执行。因此,在编译类时,验证器中的
Date.today.year
只计算一次

通过引入lambda,您可以使ActiveRecord使用所述lambda的返回值。lambda本身将在每次验证时执行


希望这能让情况更清楚

--时区中的因素

您是否需要在ActiveRecord范围内使用它?它们返回当前日期/时间。可能是缓存问题,或者您在生产代码中使用了Timecop?@AtteJuvonen我们可以查看代码吗?
Time。现在。year
将始终返回当前年份,除非您直接或通过gem处理类。如果你将值存储在完全不同的地方。在原始问题中添加代码