先に進む前に、ユーザーが「sakai_trained」配列に含まれているかどうかを確認するコードが少しあります。何らかの理由で、このコードを実行すると:
CSV.foreach(activation_csv, {:headers => true}) do |row|
if sakai_trained
row << 'Untrained' unless sakai_trained.include?(row[1])
end
course_list << row
end
このエラーが発生します
C:/Ruby193/lib/ruby/1.9.1/csv.rb:478:in `==': undefined method `row' for "stuartademo":String (NoMethodError)
from activate-courses.rb:42:in `include?'
from activate-courses.rb:42:in `block in <main>'
from C:/Ruby193/lib/ruby/1.9.1/csv.rb:1792:in `each'
from C:/Ruby193/lib/ruby/1.9.1/csv.rb:1208:in `block in foreach'
from C:/Ruby193/lib/ruby/1.9.1/csv.rb:1354:in `open'
from C:/Ruby193/lib/ruby/1.9.1/csv.rb:1207:in `foreach'
from activate-courses.rb:40:in `<main>'
最初はrow[1]に問題があると思っていましたが、文字列リテラルでも同じように壊れます。sakai_trained 配列が存在し、データも含まれていることを確認しました。また、unless ロジックに欠陥がある場合に備えて、if ステートメントとして書き直そうとしましたが、それでも同じエラーが返されます。
不明な場合は、行を course_list 配列に追加する前に、行 [1] にあるユーザー ID が sakai_trained 配列に存在することを確認したいと思います。そうでない場合は、最初に「Untrained」を行に追加してから、行を配列に追加します。until... 部分を削除すると、完全な course_list 配列を取得できましたが、予想どおり、すべての行が「訓練されていない」ものです。問題は
unless sakai_trained.include?(row[1])
一部ですが、見えません。
アップデート:
sakai_trained = []
CSV.foreach(training_csv, {:headers => true}) do |trained|
sakai_trained << trained
end
#map するべきか!.to_s を使用して各アイテムを文字列にしますか?
更新 2:
私が変更され
sakai_trained << trained
に
sakai_trained << trained.to_s
エラーは削除されましたが、出力はまだ正しくありません。
更新 3: ほぼ。働く。皆さんは信じられないほど素晴らしく、これと同じくらいイライラしますが、私はいくつかの新しく興味深いことを学びました.
コード:
course_list = []
if options[:verify]
sakai_trained = []
CSV.foreach(training_csv, {:headers => true}) do |trained|
sakai_trained << trained.to_s
end
end
CSV.foreach(activation_csv, {:headers => true}) do |row|
if sakai_trained && !sakai_trained.include?(row[1])
row << 'Untrained'
end
course_list << row
end
収量:
2124-5318、stuartademo、訓練を受けていない
2124-5320、ボブスミス、訓練を受けていない
2124-4686、ジムスミス、訓練を受けていない
2124-3560、ジルスミス、訓練を受けていない
2124-3562、スースミス、訓練を受けていない
2124-5428、ハリースミス、訓練を受けていない
あるべきとき
2124-5318、stuartademo、訓練を受けていない
2124-5320、ボブスミス
2124-4686、ジムスミス
2124-3560、ジルスミス
2124-3562、スースミス
2124-5428、ハリースミス