Prog-Box

未経験がweb系エンジニアを目指す過程をメモします。 Rails学習中

現場Rails 7章 CSV出力機能実装時のSyntaxErrorの解決方法

現場で使える Ruby on Rails 5速習実践ガイドを進めている最中に遭遇した、SyntaxErrorの解決方法についてメモします。

起きた事

Chapter 7-6における「CSVファイルのインポート/エクスポート」の項でお手本の通り写経すると、SyntaxErrorを吐く状態となりました。タスクモデル(task.rb)にto_csvというクラスメソッドを追加し、コントローラーを実装し、ビューファイルであるindex.html.slimの末尾にエクスポートボタンのリンクを設置して動作確認を行うと失敗してしまいます。

やった事

SyntaxErrorとは基本的文法ミスなので、(これまでの経験からも)ほぼ間違いなく自分のタイプミスと考えました。記述したファイルを確認し間違いがないか見ますが、書籍との差異は発見できません。続いてエラーのログを確認して、間違っている箇所を特定する事にします。
ログでは「最後の行にミスがある」と出ていましたが末尾は単なるENDで、途中のロジックが間違っていると判断し調べますが、エラー箇所が特定できませんでした。

解決方法

書籍に乗っているコードが(恐らく)間違っていて、endの個数を末尾に一つ増やすと正常に動作しました。

def self.csv_attributes
        ["name", "description", "created_at", "updated_at"]
    end

    def self.generate_csv
        CSV.generate(headers: true) do |csv|
            csv << csv_attributes
            all.each do |task|
                csv << csv_attributes.map{|attr| task.send(attr) }
            end
        end
    end

private

    def validate_name_not_including_comma
        errors.add(:name, 'にカンマを含めることはできません') if name&.include?(',')
    end
end

とすると恐らく正常に動作すると思われます。

まとめ

単純な間違いですが、ロジックにミスがあるという固定観念があると気づきにくいのだなと感じました。エラーはまず簡単な事から疑ってみるのが早そうですね。