Ruby 未定义的方法'artist';对于nil:NilClass(nomethoderor)

Ruby 未定义的方法'artist';对于nil:NilClass(nomethoderor),ruby,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.

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

#!/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>'
import_csv.rb:15:in'block in':nil:NilClass(NoMethodError)的未定义方法'artist'
来自import_csv.rb:14:in'each'
从import_csv.rb:14:in`'

我很想知道为什么会发生这个错误以及解决方法。提前谢谢

这意味着您正在对nil/Null调用artist方法

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


这意味着您正在对nil/Null调用artist方法

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


问题似乎在于
karaoke
变量的赋值。将任何内容赋给新变量时,赋值的右侧将先于左侧计算。因此,当代码到达第15行时,
karaoke
变量是
nil

因此,当您在方法
StorageRoom::File.new\u中使用
karaoke
变量时,它是一个
nil
对象<代码>卡拉OK
在计算整个作业右侧之前不包含任何内容。然后它被绑定到
karaoke
变量


你应该考虑使用诸如<代码>行[0 ] < /代码>和<代码>行[2 ] < /代码>代替<代码>卡拉OK。艺术家< /代码>和<代码>卡拉OK。流派< /代码> < 问题似乎在于

karaoke
变量的赋值。将任何内容赋给新变量时,赋值的右侧将先于左侧计算。因此,当代码到达第15行时,
karaoke
变量是
nil

因此,当您在方法
StorageRoom::File.new\u中使用
karaoke
变量时,它是一个
nil
对象<代码>卡拉OK
在计算整个作业右侧之前不包含任何内容。然后它被绑定到
karaoke
变量

你应该考虑使用诸如<代码>行[0 ] < /代码>和<代码>行[2 ] < /代码>代替<代码>卡拉OK。艺术家< /代码>和<代码>卡拉OK。流派< /代码> < 查看第15行(

import_csv.rb:15
告诉您在哪里搜索问题):

在作业表达式的右侧部分,您使用
karaoke.artist
karaoke.song
来构造
:文件
部分
歌曲
,但
karaoke
变量尚未初始化(它显示在左侧)。事实上,ruby解释器在看到赋值运算符并开始计算赋值表达式的右侧部分(初始化变量)时定义了
karaoke
变量,但失败了,因为定义的变量具有
nil
值。

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


在作业表达式的右侧部分,您使用
karaoke.artist
karaoke.song
来构造
:文件
部分
歌曲
,但
karaoke
变量尚未初始化(它显示在左侧)。事实上,ruby解释器在看到赋值运算符并开始计算赋值表达式的右侧部分(初始化变量)时定义了
karaoke
变量,但失败了,因为定义的变量具有
nil
值。

不能使用karaoke对象初始化自身

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


解释器计算“右部分”的值,它是某个表达式或值,然后将其分配给变量。您的变量karaoke以前从未使用过,这意味着它的值为零。这就是为什么会出现此错误。

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

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


解释器计算“右部分”的值,它是某个表达式或值,然后将其分配给变量。您的变量karaoke以前从未使用过,这意味着它的值为零。这就是为什么会出现此错误。

看起来您的
karaoke
对象没有实例化。@Adrienshuler我不明白。它不是在第15行实例化的吗?歌曲在第12行被实例化了,对吗?或者我遗漏了什么?您不能在您的卡拉OK对象构造函数中直接使用文件名为(“{karaoke.artist}{karaoke.song}.mov”)的
StorageRoom::File.new_。您试图在对象属性尚未实例化时访问该对象属性。您的
karaoke
对象似乎未实例化。@Adrienshuler我不明白。它不是在第15行实例化的吗?歌曲在第12行被实例化了,对吗?或者我遗漏了什么?您不能在您的卡拉OK对象构造函数中直接使用文件名为(“{karaoke.artist}{karaoke.song}.mov”)的
StorageRoom::File.new_。您正在尝试访问对象属性,但对象属性尚未实例化。注意:尽管我先回答了,但您可能希望重新选择将问题授予谁,因为其他答案更全面。您想得真周到!我会的。注意,尽管我先回答了,但你可能想重新选择将问题授予谁,因为其他答案更全面。你想得真周到!我会的。
karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], :file => StorageRoom::File.new_with_filename("#{row[0]}#{row[1]}.mov"))
karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], 
  :file => StorageRoom::File.new_with_filename("#{karaoke.artist}#{karaoke.song}.mov"))
a = some_expression_or_value