【エラー】SyntaxError: unexpected ':', expecting keyword_end への対処


背景

Rails Tutorialにてバリデーションを書き、行が多くなったため改行をしながら書いていたら、SyntaxError: unexpected ':', expecting keyword_end と吐かれた。プログラミングも英語も初心者で英語に至っては外人に道を聞かれてもpardon?とAre you kidding?の2語を使って説明するレベルの人間なので、何が何だかわからないモーマンタイ。

結論

エラーメッセージ SyntaxError: unexpected ':', expecting keyword_end は日本語に直すと

文法エラーで、「:」は期待されてなくて、期待されてるのはキーワードエンドだよ。
つまり、キーワードの終わりは「:」じゃないよ

という意味で、

区切りにはコロン「:」ではなくカンマ「,」を入れようね。という話。

解決法

class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX }
                    uniqueness: { case_sensitive: false }
end

といったコードを書いていたが、これの4行目以降、validates:emailuniqueness:の行でエラーになっていた。

英語の意味を読み解くと、SyntaxError: unexpected ':', expecting keyword_end

文法エラーで、「:」は期待されてなくて、期待されてるのはキーワードエンドだよ。
つまり、キーワードの終わりは「:」じゃないよ

ということらしい。

つまり、コンピュータ上でformatの処理は本来の意図であるformat: { with: VALID_EMAIL_REGEX },でなく、format: { with: VALID_EMAIL_REGEX }uniqueness:
まで認識されており、これが区切り方として違うだろ!という話。

このように

format: { with: VALID_EMAIL_REGEX },
uniqueness: true

でカンマで区切るべきである。

カンマ「,」やセミコロン「:」といった区切りを入れ忘れるとこんな目に遭うよという意味で、いい教訓になったのかなと。そのように思うで候。