背景
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:email
のuniqueness:
の行でエラーになっていた。
英語の意味を読み解くと、SyntaxError: unexpected ':', expecting keyword_end
は
文法エラーで、「:」は期待されてなくて、期待されてるのはキーワードエンドだよ。
つまり、キーワードの終わりは「:」じゃないよ
ということらしい。
つまり、コンピュータ上でformatの処理は本来の意図であるformat: { with: VALID_EMAIL_REGEX },
でなく、```format: { with: VALID_EMAIL_REGEX }uniqueness:
このように
```format: { with: VALID_EMAIL_REGEX },
uniqueness: true```
でカンマで区切るべきである。
カンマ「,」やセミコロン「:」といった区切りを入れ忘れるとこんな目に遭うよという意味で、いい教訓になったのかなと。そのように思うで候。