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

时间:2012-04-04 12:17:06

标签: 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

错误是:

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 个答案:

答案 0 :(得分: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的{​​{1}}部分,但Song变量尚未初始化(它出现在左侧)。实际上ruby解释器定义了 karaoke变量,当它看到赋值运算符并开始评估赋值表达式的右手部分(到初始化变量)并失败时,因为已定义变量的值为karaoke

答案 1 :(得分:2)

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

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

您应该考虑使用row[0]row[2]而不是karaoke.artistkaraoke.genre

答案 2 :(得分:1)

这意味着你在nil / Null上调用artist方法

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

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

答案 3 :(得分:1)

您无法在初始化时使用卡拉OK对象。

在你写的红宝石中(假设你之前从未使用过“a”变量)

a = some_expression_or_value

解释器计算“右边部分”的值,该值是某个表达式或值,然后将其赋值给变量。之前没有使用过你的变量卡拉OK,这意味着它的值是零。这就是你得到这个错误的原因。