【问题标题】:Ruby runt precision errorRuby runt 精度错误
【发布时间】:2013-02-14 23:50:26
【问题描述】:

我在 rails 3 升级(ruby 1.9.3)中使用runt gem,并收到此错误:undefined methodprecision' for nil:NilClass`。

这是在 irb/pry 上复制它的方法:

> require 'runt'
=> true
> start_at = Runt::PDate.min(2009,1,1, 0, 0)
=> #<Runt::PDate: 2009-01-01T00:00:00+00:00 ((2454833j,0s,0n),+0s,2299161j)>
> end_at = Runt::PDate.min(2009,1,1, 1, 30)
=> #<Runt::PDate: 2009-01-01T01:30:00+00:00 ((2454833j,5400s,0n),+0s,2299161j)>
> runt_pattern = Runt::EveryTE.new(start_at, 600)
=> every 600 minutes starting Thu Jan  1 00:00:00 2009
> date_range = Runt::DateRange.new(start_at, end_at)
=> #<Runt::PDate: 2009-01-01T00:00:00+00:00 ((2454833j,0s,0n),+0s,2299161j)>
..
#<Runt::PDate: 2009-01-01T01:30:00+00:00 ((2454833j,5400s,0n),+0s,2299161j)>
> schedule = Runt::Schedule.new
=> #<Runt::Schedule:0x007fd46cad56b8 @elems={}>
> schedule.add 'events', runt_pattern
=> every 600 minutes starting Thu Jan  1 00:00:00 2009
> schedule.dates('events', date_range)
NoMethodError: undefined method `precision' for nil:NilClass
from /Users/ttt/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/runt-0.7.0/lib/runt/dprecision.rb:121:in `<=>'

有人知道吗?

似乎是被这行代码触发的:https://github.com/texel/runt/blob/master/lib/runt/schedule.rb#L28,但仍在试图弄清楚如何进一步挖掘代码。

我注意到有一些更新的小版本,例如https://github.com/craigw/runt,但它们似乎也无法解决问题。

它在 ree-1.8.7-2011.03 上的 rails2 上工作,并返回 [Thu, 01 Jan 2009 00:00:00 +0000]

编辑:添加了 rails2 返回的内容。

【问题讨论】:

  • 因为它可以在 rails 2 上运行,并且它可能正在使用 activesupport。所以我想有一个与 rails 3 的 activesupport 不兼容。因为你发送的代码是 4 岁。
  • 有没有地方可以显示发生了什么变化?我认为这可能更像是 ruby​​ 1.8.7 到 ruby​​ 1.9.3 的问题,因为我在这个库中找到了另一个问题。
  • 它适用于 ruby​​ 1.9.2p290 - 必须更改为 ruby​​ 1.9.3

标签: ruby ruby-on-rails-3 gem


【解决方案1】:

看来您的问题出在EveryTE class。在初始化方法中有一个可选的精度参数。

class EveryTE

  include TExpr

  def initialize(start,n,precision=nil)
    @start=start
    @interval=n
    # Use the precision of the start date by default
    @precision=precision || @start.date_precision
  end

  def include?(date)
    i=DPrecision.to_p(@start,@precision)
    d=DPrecision.to_p(date,@precision)
    while i<=d
      return true if i.eql?(d)
      i=i+@interval
    end
    false
  end

  def to_s
    "every #{@interval} #{@precision.label.downcase}s starting #{Runt.format_date(@start)}"
  end

end

我会尝试提供精度而不是接受默认的 nil。

> runt_pattern = Runt::EveryTE.new(start_at, 600,Runt::DPrecision::Precision.sec)

这是完整的精度列表(DPrecision class):

Precision.year
Precision.month
Precision.week
Precision.day
Precision.hour
Precision.min
Precision.sec
Precision.millisec

【讨论】:

  • 我试过这个,得到了同样的错误。同样@precision 将等于start_at.precision (DPrecision::MINUTE) 在这一行:github.com/texel/runt/blob/master/lib/runt/…,所以在这种情况下它不会是零。
  • 另外,作为参考,并在控制台中进行测试,您可以使用runt_pattern = Runt::EveryTE.new(start_at, 600, Runt::DPrecision::Precision.min)
猜你喜欢
  • 2015-05-30
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多