0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【豆知識とError】belongs_toとvalidatesのちょっとした誤解

Last updated at Posted at 2024-09-02

はじめに

正確にはエラーではありませんが、バリデーションメッセージの表示が何かおかしかったので、どう解決したのかとそこから学んだことをアウトプットしたいと思います

環境

  • Windows, WSL
  • Docker
  • Ruby 3.2.3
  • Rails 7.1.3

バリデーションメッセージが何かおかしい

Image from Gyazo

文字が英語表記というのは一旦おいておいて。同じ単語が表示されていることがわかるかと思います。
このバリデーションメッセージを確認する為、関連するファイルを見てみると次のようなコードを入力していました。

  # モデル間の関連を定義
  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だけがバリデーションメッセージに関わっているだけだと思っていたので、今回で知ることができてよかった。

今回の記事が何か参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?