nil的未定义方法`gsub'的奇怪错误:nil的NilClass和undefined方法`strptime':NilClass RoR 2.3.8

时间:2012-11-16 14:01:48

标签: ruby-on-rails csv null

您好我正在尝试阅读csv文件,我的代码是这样的:

CSV.foreach(path, {:col_sep => @seperator}) do |row|
    #CSV.foreach(File.basename(path), {:col_sep => @seperator}) do |row|
        r = Route.new
        r.contact_id = contact_id
        r.name = row[0]
        r.number_range = row[1]
        r.rate = row[3].gsub(",", ".").to_f
        r.valid_from = DateTime.strptime(row[5], @time_format) 
        r.currency = @currency
        r.save
    end

我在这方面遇到了问题:

        r.rate = row[3].gsub(",", ".").to_f
        r.valid_from = DateTime.strptime(row[5], @time_format) 

我收到错误:undefined method 'gsub' for nil:NilClass

undefined method `strptime' for nil:NilClass

但是我完全确定第[3]行和第5行没有任何关于它为什么会发生的任何想法?提前谢谢!

1 个答案:

答案 0 :(得分:0)

.gsub()是一个String方法,所以只有当row [3]值是一个字符串时它才会起作用。看来你的一些行是零。为避免这种情况,您可以为nil值添加一个简单的检查器

r.rate = row[3].gsub(",",".").to_f if row[3].nil?

下一行再次出现相同的错误。所以你可以把它改成:

r.valid_from = DateTime.strptime(row[5], @time_format) if row[5].nil?

你说你确定这些值不是零,但这正是错误所说的。它只需要1行和一个零值来打破整个脚本。

你也在对第3行和第5行进行硬编码。也许你的意思是不同的行?尝试测试以确保该行与您在IRB中的确切等同。你能告诉我们什么行[3]和行[5]相等吗?