2

这是一个奇怪的想法。按照我的步骤:

没有上帝,在控制台上:

> d=Date.parse("2010-02-01")
=> Mon, 01 Feb 2010
> d+1.day
=> Tue, 02 Feb 2010

完美的。

然后,我去我的 Gemfile 并添加

gem 'god'

并运行

bundle install

之后,再次在控制台上:

> d=Date.parse("2010-02-01")
=> Mon, 01 Feb 2010 
> d+1.day
=> Sun, 23 Aug 2246

你知道会发生什么吗?

4

3 回答 3

2

奇怪的是,这发生在控制台中。我本可以在其他情况下理解它,其中 1.day 在一个地方用作输入并提取到其他地方使用,因为 1.day 是 Fixnum 86400,其中#steps混合了一些特殊的元数据 ( )。

Date对待,例如,+ 1表示“增加一天”。Rails 添加了一些行为,以便它理解1.day事物(86400“秒”,但带有stepof [1, :days])实际上意味着+ 1而不是+ 86400. 这就是你失去的:

ruby-1.9.2-p290 :171 > d = Date.parse("2010-02-01")
 => #<Date: 2010-02-01 (4910457/2,0,2299161)> 
ruby-1.9.2-p290 :172 > d + 86400
 => #<Date: 2246-08-23 (5083257/2,0,2299161)> 
ruby-1.9.2-p290 :173 > 

因此,该值1.day被解释为 Fixnum,而不是带有ActiveSupport::Duration.

irb(main):001:0> Date.parse("2010-02-01") + 1.day.to_i
=> Sun, 23 Aug 2246

因此,如果您在1.day不立即使用此值的上下文中使用此值,请不要...改用 Fixnum 1 ;)

于 2011-10-01T00:53:22.457 回答
1

“上帝”把日期弄得一团糟。这是“神”的问题。与 Rails 一起使用的 gem 不应该改变 Rails 的约定。如果 Date.current - 4.days 在没有“上帝”的情况下做一件事,那么它应该用“上帝”来做。时期。

于 2012-01-25T18:56:52.260 回答
0

根据GitHub 公开问题,我尝试了这个解决方案:

宝石文件

gem 'god', :require => false

代替 :

gem 'god'

一切似乎再次起作用:

1.9.3p0 :001 > d = Date.parse('2012-04-16')
 => Mon, 16 Apr 2012 
1.9.3p0 :002 > d + 1.day
 => Tue, 17 Apr 2012 
于 2012-04-16T09:41:18.183 回答