3
2

More than 3 years have passed since last update.

【Rails6】belongs_toによるバリデーション

Last updated at Posted at 2020-12-28

はじめに

ポートフォリオ作成中に発生したエラーについて、備忘録のため記述しています。補助金に関する記事の検索・閲覧ができるポートフォリオを作成しています。

環境

Ruby on Rails '6.0.0'
Ruby '2.6.5'

エラー内容

バリデーションに関するエラーになります。エラー文は以下の通りです。

web_1  |   ↳ (pry):1:in `create'
web_1  |   Article Load (0.8ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`id` = 4 LIMIT 1
web_1  |   ↳ (pry):1:in `create'
web_1  |   User Load (0.7ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
web_1  |   ↳ (pry):1:in `create'
web_1  |    (0.3ms)  ROLLBACK
web_1  |   ↳ (pry):1:in `create'
web_1  | ActiveRecord::RecordInvalid: バリデーションに失敗しました: Companyを入力してください

学んだこと①:Docker環境におけるbinding.pryの方法

開発環境にDockerを導入しており、エラーの詳細を知るためにbinding.pryを活用しました。しかし、Docker環境でコマンド実行するのは初めてでした。今回はdocker上でbinding.pryを実行するを参考にさせていただきました。ありがとうございました。

% docker-compose up
% docker ps
% docker attach コンテナID or コンテナ名

上記コマンドを実行することでデバックモードを起動し、エラーコードを確認することができました。

学んだこと②:save!メソッドの使用

app/controllers/comments_controller.rb
  def create
    @comment = Comment.new(comment_params)
    if @comment.save
      ActionCable.server.broadcast 'comment_channel', content: @comment
    else
      render :new
    end
  end

今回は上記に記載した、コメント機能によるcreateアクション部分でエラーが発生しました。当初ログを確認しても、エラー文の詳細が明記されておらず、分からない状態でした。
そこで、saveメソッドでエラーが発生した時のデバック方法の記事を参考にさせていただきました。ありがとうございました。
Railsのsaveメソッドは保存できなかった場合は、「false」を返すのみであり、エラーログは確認できません。「save!」を使用することでエラー内容を把握できるというものでした。

8: def create
web_1  |      9:   @comment = Comment.new(comment_params)
web_1  |  => 10:   binding.pry
web_1  |     11:   if @comment.save
web_1  |     12:     ActionCable.server.broadcast 'comment_channel', content: @comment
web_1  |     13:   else
web_1  |     14:     render :new
web_1  |     15:   end
web_1  |     16: end
web_1  | 
[1] pry(#<CommentsController>)> 
[2] pry(#<CommentsController>)> @comment.save!
   (0.6ms)  BEGIN
web_1  |   ↳ (pry):1:in `create'
web_1  |   Article Load (0.8ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`id` = 4 LIMIT 1
web_1  |   ↳ (pry):1:in `create'
web_1  |   User Load (0.7ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
web_1  |   ↳ (pry):1:in `create'
web_1  |    (0.3ms)  ROLLBACK
web_1  |   ↳ (pry):1:in `create'
web_1  | ActiveRecord::RecordInvalid: バリデーションに失敗しました: Companyを入力してください

③学んだこと:belongs_toによるバリデーションについて

ここで、バリデーションに関するエラーであることが、把握できました。ここから確認を行ったこととして
- migrationファイルを確認し、「null: false」の書き換えを行う
- commentモデルを確認し、「presence: true」部分の書き換えを行う

以上の2つを変更し、再度試してみましたが、結果は変わらず。
ということで、 (個人メモ)Rails5で関連を定義した時はbelongs_toに気をつけるこちらの記事にたどり着きました。

「belongs_to」を使用する場合は、belongs_to関連の外部キーでnilを許可しないようにするために「required:true」がデフォルトで搭載されるということでした。

解決するために

app/models/comments
class Comment < ApplicationRecord
  belongs_to :article
  belongs_to :user, optional: true
  belongs_to :company, optional: true

  validates :text, presence: true
end

optional: trueを明記することで、「nil」を許可することができ、無事解決することができました!!!

おわりに

ご参考にさせていただいた記事の作成者の方々、本当にありがとうございました。

3
2
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
3
2