未定义的方法`artist'代表nil:NilClass(NoMethodError)

han*_*sen 1 ruby

我运行以下代码时收到此错误:

#!/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
Run Code Online (Sandbox Code Playgroud)

错误是:

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>'
Run Code Online (Sandbox Code Playgroud)

我有兴趣了解为什么会出现此错误以及解决方案.提前致谢!

Ali*_*kau 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"))
Run Code Online (Sandbox Code Playgroud)

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