#はじめに
ポートフォリオ作成中に発生したエラーについて、備忘録のため記述しています。補助金に関する記事の検索・閲覧ができるポートフォリオを作成しています。
#環境
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!メソッドの使用
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」がデフォルトで搭載されるということでした。
解決するために
class Comment < ApplicationRecord
belongs_to :article
belongs_to :user, optional: true
belongs_to :company, optional: true
validates :text, presence: true
end
optional: trueを明記することで、「nil」を許可することができ、無事解決することができました!!!
#おわりに
ご参考にさせていただいた記事の作成者の方々、本当にありがとうございました。