运行以下代码时出现此错误:
#!/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>'
我有兴趣了解为什么会出现此错误以及解决方案。提前谢谢!
答案 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.artist
和karaoke.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.artist
和karaoke.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,这意味着它的值是零。这就是你得到这个错误的原因。