1

次のコードを実行すると、このエラーが発生します。

#!/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

4 に答える 4

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"))

代入式の右側で and を使用karaoke.artistしての一部をkaraoke.song作成しますが、変数はまだ初期化されていません (左側に表示されます)。実際、Ruby インタプリタは代入演算子を見て変数を定義し、代入式の右辺の評価 (変数の初期化) を開始し、定義された変数に値があるため失敗しました。:fileSongkaraoke karaokenil

于 2012-04-04T12:30:03.450 に答える
2

問題はkaraoke変数の割り当てにあるようです。新しい変数に何かを代入する場合、代入の右側が左側より前に計算されます。したがって、コードが 15 行目に到達した時点で、karaoke変数はnil.

したがって、karaokeメソッドで変数を使用するStorageRoom::File.new_with_filenameと、それはnilオブジェクトになります。karaoke割り当ての右側全体が計算されるまで、何も含まれません。次に、karaoke変数に関連付けられます。

row[0]androw[2]の代わりにkaraoke.artistandのようなものを使用することを検討する必要がありkaraoke.genreます。

于 2012-04-04T12:29:44.743 に答える
1

カラオケオブジェクト自体を初期化することはできません。

書くときはルビで(「a」変数を一度も使用したことがないと仮定して)

a = some_expression_or_value

インタープリターは、何らかの式または値である「右側の部分」の値を計算し、それを変数に割り当てます。変数 karaoke は以前に使用されたことがないため、その値は nil です。そのため、このエラーが発生します。

于 2012-04-04T12:31:48.580 に答える
1

nil/Null でアーティスト メソッドを呼び出していることを意味します。

#{karaoke.artist}#{karaoke.song} を #{row[0]}#{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"))
于 2012-04-04T12:25:34.133 に答える