はじめに
正確にはエラーではありませんが、バリデーションメッセージの表示が何かおかしかったので、どう解決したのかとそこから学んだことをアウトプットしたいと思います
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
バリデーションメッセージが何かおかしい
文字が英語表記というのは一旦おいておいて。同じ単語が表示されていることがわかるかと思います。
このバリデーションメッセージを確認する為、関連するファイルを見てみると次のようなコードを入力していました。
# モデル間の関連を定義
belongs_to :user # PostはUserに属している
belongs_to :prefecture # PostはPrefecture(都道府県)に属している
belongs_to :station # PostはStation(駅名)に属している
belongs_to :line # PostはLine(路線名)に属している
has_many :favorites, dependent: :destroy # Postは多くのFavoriteを持ち、Postが削除されたら関連するFavoriteも削除される
# バリデーション(データの保存前にチェックするルール)
validates :line, presence: true # 路線名は必須
validates :photo_image, presence: true # 画像のアップロードは必須
validates :station, presence: true # 駅名は必須
validates :location, presence: true # 撮影場所は必須
validates :prefecture, presence: true # 都道府県は必須
validates :shooting_time, presence: true # 撮影時間は必須
validates :comment, presence: true, length: { maximum: 250 } # コメントは必須で、最大250文字まで
end
belongs_toがバリデーションの役割をしているのか?
上記のコードと画面からbelongs_to
がバリデーションの役割をしているのかと思いましたが、実際はそうではないようで。
belongs_to の役割は、モデル間の関連付けを行うことです。belongs_to 自体にはバリデーション機能はありませんが、belongs_to の関連付けに対して、Rails にはデフォルトでバリデーションが組み込まれています。
つまり、belongs_to で関連付けたモデルが存在しない場合、Rails では自動的にバリデーションが追加されるということ。
だから2回同じ内容のエラーメッセージが表示されていたという事がわかりました。
ついでに次のように修正したらとりあえず解決
class Post < ApplicationRecord
# 関連付け
belongs_to :user
belongs_to :prefecture
belongs_to :station
belongs_to :line
# 明示的なpresenceバリデーションを削除
validates :photo_image, presence: true
validates :location, presence: true
validates :shooting_time, presence: true
validates :comment, presence: true, length: { maximum: 250 }
end
さいごに
belongs_to
で設定した関連付けのバリデーションエラーは、Post
モデルの関連付け属性が正しく設定されているかどうかが大切だという事がわかりました。
validatesだけがバリデーションメッセージに関わっているだけだと思っていたので、今回で知ることができてよかった。
今回の記事が何か参考になれば幸いです。