Ruby块 - NoMethodError:未定义的方法` - '表示nil:NilClass

时间:2013-01-13 12:01:15

标签: ruby ruby-on-rails-3 syntax block

开始使用Rails,我遇到了阻塞操作。我想循环遍历模型并通过计算两个日期时间字段之间的差异来更新新字段的整数值。在控制台中执行此操作:

MyModel.all.each do |m|
  m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field
  m.save!
end

结果是

 NoMethodError: undefined method `-' for nil:NilClass

如果我这样做,它可以在一条记录上运行:

m = MyModel.find(1)
m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field
m.save

我想这是一个基本的语法,但找不到明显的解释。感谢能够获得一些指示。

2 个答案:

答案 0 :(得分:1)

其中一个实例中的m.existing_datetime_field为nil,因此操作无效。如果不确定,您需要检查零值:

MyModel.all.each do |m|
  unless m.existing_datetime_field == nil
    m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field
  m.save!
end

答案 1 :(得分:0)

正如我已经说过的那样,实例的一个属性可能是nil

要检查此项,请在实例上使用#inspect

MyModel.all.each {|i| puts i.existing_datetime_field.inspect }

似乎其中一个对象是nil,然后未定义-方法。

如您所建议,您可以先检查操作数以计算差异。