1

运行以下代码时出现此错误:

#!/usr/bin/env ruby -rubygems
require File.join(File.dirname(__FILE__), 'authentication')
require "csv" # faster_csv (ruby 1.9)

lines = CSV.read(File.join(File.dirname(__FILE__), 'karaoke.csv')) # Exported an Excel file as CSV
lines.slice!(0) # remove header line
collection = StorageRoom::Collection.find('collection ID')
Song = collection.entry_class
lines.each do |row|
  karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], :file => StorageRoom::File.new_with_filename("#{karaoke.artist}#{karaoke.song}.mov"))
  if karaoke.save
    puts "Misuero Karaoke Latino saved: #{karaoke.artist}, #{karaoke.song}, #{karaoke.genre}"
  else
    puts "Misuero Karaoke Latino could not be saved: #{karaoke.errors.join(', ')}"
  end
end

错误是:

import_csv.rb:15:in `block in <main>': undefined method `artist' for nil:NilClass (NoMethodError)
    from import_csv.rb:14:in `each'
    from import_csv.rb:14:in `<main>'

我有兴趣了解为什么会发生此错误以及解决方案。提前致谢!

4

4 回答 4

5

查看第 15 行(import_csv.rb:15告诉您在哪里搜索问题):

karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], 
  :file => StorageRoom::File.new_with_filename("#{karaoke.artist}#{karaoke.song}.mov"))

在赋值表达式的右侧,您使用karaoke.artistkaraoke.song构造, 但变量的:file一部分尚未初始化(它出现在左侧)。事实上,当红宝石解释器看到赋值运算符并开始评估赋值表达式的右侧部分(初始化变量)并失败时,它定义了变量,因为定义变量具有值。Songkaraoke karaokenil

于 2012-04-04T12:30:03.450 回答
2

看来问题在于您对karaoke变量的分配。当您将任何内容分配给新变量时,分配的右侧在左侧之前计算。因此,当您的代码到达第 15 行时,karaoke变量是nil.

因此,当您karaoke在方法中使用变量时StorageRoom::File.new_with_filename,它就是一个nil对象。karaoke在计算整个赋值右侧之前不包含任何内容。然后它与karaoke变量相关联。

您应该考虑使用类似row[0]androw[2]而不是karaoke.artistand karaoke.genre

于 2012-04-04T12:29:44.743 回答
1

这意味着您在 nil/Null 上调用艺术家方法

可能尝试用#{row[0]}#{row[1]}替换#{karaoke.artist}#{karaoke.song}

karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], :file => StorageRoom::File.new_with_filename("#{row[0]}#{row[1]}.mov"))
于 2012-04-04T12:25:34.133 回答
1

您不能使用卡拉 OK 对象来初始化自身。

在您编写时使用 ruby​​(假设您以前从未使用过“a”变量)

a = some_expression_or_value

解释器计算“右部分”的值,即某个表达式或值,然后将其分配给变量。你的变量 karaoke 之前没有被使用过,这意味着它的值是 nil。这就是您收到此错误的原因。

于 2012-04-04T12:31:48.580 回答