質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%

解決済

Rails6_バリデーションにかかったときのエラーメッセージを表示できない。

shisoshiso
shisoshiso

総合スコア15

1回答

1評価

1クリップ

513閲覧

投稿2022/02/17 13:53

編集2022/02/19 18:19

前提・実現したいこと

バリデーションに引っかかった時にエラーメッセージを表示したいのですが、表示されません。

参考記事
バリデーションの実装
https://qiita.com/nakanishi03/items/d1be27c74c98855423ab
デバッグ方法
https://techtechmedia.com/error-messages-validation-rails/

イメージ説明

models/event.rb
バリデーションは、下記を設定しています。
未入力で「Create Event」をクリックすると、全5項目がバリデーションエラーを起こします。

ruby

class Event < ApplicationRecord validates :name, length: { maximum: 50 }, presence: true validates :place, length: { maximum: 100 }, presence: true validates :content, length: { maximum: 2000 }, presence: true validates :start_at, presence: true validates :end_at, presence: true # カスタムバリデーション # https://qiita.com/yutas-8/items/8b6b4b6ce876ad2cf26b validate :start_at_should_be_before_end_at private # 開始時間は終了時間よりも前の時間 def start_at_should_be_before_end_at return unless start_at && end_at if start_at >= end_at errors.add(:start_at, "は終了時間よりも前に設定して下さい") end end end

controllers/events_controller.rb
バリデーションに引っかかり保存できなかったときは、views/events/new.html.slimをレンダリングします。

ruby

class EventsController < ApplicationController def new @event = current_user.created_events.build end def create @event = current_user.created_events.build(event_params) if @event.save redirect_to @event, notice: "作成しました" else render :new end end private def event_params params.require(:event).permit( :name, :place, :content, :start_at, :end_at ) end end

views/events/new.html.slim
バリデーションエラーを起こした時は、= render "shared/errors", model: f.objectでエラーメッセージを差し込みます。

ruby

- now = Time.zone.now h1.mt-2 イベント作成 = form_with(model: @event, class: "form-horizontal") do |f| = render "shared/errors", model: f.object .form-group = f.label :name = f.text_field :name, class: "form-control" .form-group = f.label :place = f.text_field :place, class: "form-control" .form-group = f.label :start_at div = f.datetime_select :start_at, start_year: now.year, end_year: now.year + 1 .form-group = f.label :end_at div = f.datetime_select :end_at, start_year: now.year, end_year: now.year + 1 .form-group = f.label :content = f.text_area :content, class: "form-control", row: 10 = f.submit class: "btn btn-primary"

- if model.errors.any?で@event.errors.any?がtrueの時だけ表示するようにしています。
views/shared/_errors.html.slim

ruby

- if model.errors.any? .alert.alert-danger ul.mb-0 - model.errors.full_messages.each do |message| li = message

自分で調べたことや試したこと

最低限以下のことはチェックしましたが、解決に至りませんでした。

  • _errors.html.slimのレンダリングは正しくできているか?

 - if model.errors.any?をコメントアウトして、適当なテキストを追加するとブラウザで表示できることを確認できたため、レンダリングすることはできている。

  • バリデーションは動作している?

 binding.pryでデバッグしてみましたが、正しく動作している。デバッグ詳細は下記。Nameなど全て未入力です。

ruby

6: def create 7: @event = current_user.created_events.build(event_params) 8: 9: if @event.save 10: redirect_to @event, notice: "作成しました" 11: else 12: => 13: binding.pry 14: 15: render :new 16: end 17: end [1] pry(#<EventsController>)> @event.errors.any? => true [2] pry(#<EventsController>)> @event.errors.full_messages => ["Name can't be blank", "Place can't be blank", "Content can't be blank", "Start at は終了時間よりも前に設定して下さい"]
  • slim記法が間違っている?

下記記事を参考にチェックしましたが、問題ない。
https://pikawaka.com/rails/slim

現状完全に手詰まり状態になってしまっているため、少しでも気になる点があればご教授いただけるとありがたいです。
よろしくお願いいたします。

使っているツールのバージョンなど補足情報

Rails 6.0.3
ruby 2.6.5
slim-rails (3.3.0)

補足ですが、こちらはパーフェクト Ruby on Railsの演習の一部です。
書籍ではSJRで実装されていますが、その方法でもうまくいかなかった為、以前実装したことのある今回の手法を試しています。(今回もうまくいっていないのですが。。)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る