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