【问题标题】:NoMethodError when requesting datetime element请求日期时间元素时出现 NoMethodError
【发布时间】:2011-04-01 11:49:24
【问题描述】:

我尝试使用 ruby​​ on rails 在我的数据库中请求一个日期时间条目。这在 linux 环境中工作得很好,但在我的 windows 环境中我得到一个 NoMethodError。在调试它时,我发现将日期时间字符串转换为时间时,错误发生在 schema_definitions.rb 的第 201 行

def fast_string_to_time(string)
            if string =~ Format::ISO_DATETIME
              microsec = ($7.to_f * 1_000_000).to_i <<====== This is line 201
              new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
            end
          end

观看 $7 我得到 nil 时,似乎 $7 没有初始化。在这种情况下,7 美元是多少?我的字符串是

2011-04-01 10:48:57

这是对应包含日期的数组条目调用验证后的跟踪部分

activerecord (3.0.1) lib/active_record/connection_adapters/abstract/schema_definitions.rb:201:in `fast_string_to_time'
activerecord (3.0.1) lib/active_record/connection_adapters/abstract/schema_definitions.rb:139:in `string_to_time'
activerecord (3.0.1) lib/active_record/connection_adapters/abstract/schema_definitions.rb:78:in `type_cast'
activerecord (3.0.1) lib/active_record/attribute_methods/read.rb:83:in `read_attribute'
activerecord (3.0.1) lib/active_record/base.rb:1558:in `attributes'
activerecord (3.0.1) lib/active_record/base.rb:1558:in `each'
activerecord (3.0.1) lib/active_record/base.rb:1558:in `attributes'
activerecord (3.0.1) lib/active_record/attribute_methods.rb:57:in `attribute_method?'
activemodel (3.0.1) lib/active_model/attribute_methods.rb:394:in `match_attribute_method?'
activemodel (3.0.1) lib/active_model/attribute_methods.rb:393:in `each'
activemodel (3.0.1) lib/active_model/attribute_methods.rb:393:in `match_attribute_method?'
activemodel (3.0.1) lib/active_model/attribute_methods.rb:378:in `respond_to?'
activerecord (3.0.1) lib/active_record/attribute_methods.rb:52:in `respond_to?'
activerecord (3.0.1) lib/active_record/callbacks.rb:268:in `deprecated_callback_method'
activerecord (3.0.1) lib/active_record/validations.rb:57:in `valid?'

【问题讨论】:

    标签: mysql ruby-on-rails ruby windows datetime


    【解决方案1】:

    Format::ISO_DATETIME 是一个正则表达式: /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(.\d+)? \z/

    第 7 次捕获是小数秒(例如“.123”),它先转换为浮点数,然后再转换为微秒。在您的字符串中,$7 将为 nil,但这不是问题,因为 nil.to_f 只是 0.0。 尝试在控制台中执行 nil.to_f 以确保获得 0.0。

    您确定 NoMethodError 是由该行引起的吗?你能发布回溯吗?

    【讨论】:

    • 在 whiny_nil.rb 中似乎出现了 NoMethodError。也许在生产模式下工作时可能会出现问题?无论如何,这不会很好,因为测试中有错误。
    • 在 netbeans 中我尝试将 nil.to_f 作为监视变量并返回 nil,在执行 nil.to_i 时返回 0
    • 在 fast_string_to_time 中注释掉 microsec = ($7.to_f * 1_000_000).to_i 行并将 microsec 设置为 0 时,它可以工作
    • 尝试运行:ruby -e "p nil.to_f"(如果将 RUBYOPT 环境变量设置为需要任何库,则应在运行命令时取消设置)。那仍然返回 nil 吗?另外,你的 ruby​​ 版本在 linux 和 windows 之间是一样的吗?
    • 另一件事要尝试。运行此命令以跟踪 to_f 函数调用; to_f 输出行应以“c-call”和“c-return”开头。如果他们不这样做,则某些库正在拦截呼叫。运行命令: ruby​​ -e "set_trace_func proc {|event, file, line, id, binding, classname| printf %Q{%8s %s:%-2d %10s %8s\n}, event, file, line, id, classname }; nil.to_f; set_trace_func nil"
    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多