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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1349閲覧

バリデーションエラーメッセージ が表示されない

natecosan

総合スコア23

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/07/23 05:51

前提・実現したいこと

railsで簡単な日記アプリを作っています。
新規登録画面で、入力内容に対するバリデーションメッセージを表示させたいのですが、エラーが表示されません。
通常の投稿は成功します。

パーシャルの方にうまく@book.errorsが渡されていないのかなと思うのですが、
どこが原因かわからず・・・
どうぞ宜しくお願いします。

発生している問題・エラーメッセージ

入力フォームを空欄にして投稿すると、投稿画面のレンダリングは行われるものの、エラーメッセージ部分だけが表示されません。
以下は投稿後のデバッグ画面で、@book.errorsが入っているかを確認していますが、入っているようです。

Started POST "/books" for ::1 at 2019-07-23 14:34:16 +0900 Processing by BooksController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"d7bRtzID67YM5K9qFmSCtZ9WYgKTHjCmI+zfQ1b0DpiCb+DI4fe4AjKR7GvpsVol9JjfFaJMRzWr007R0xFWjg==", "book"=>{"name"=>"", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"つくる"} (0.1ms) begin transaction ↳ app/controllers/books_controller.rb:8 (0.1ms) rollback transaction ↳ app/controllers/books_controller.rb:8 Rendering books/new.html.slim within layouts/application Rendered shared/_error_messages.html.slim (4.0ms) Rendered books/new.html.slim within layouts/application (19.6ms) Rendered layouts/_header.html.slim (4.0ms) Return value is: nil [10, 19] in /Users/iwai/environment/ournikki/app/controllers/books_controller.rb 10: redirect_to @book 11: else 12: render 'new' 13: debugger 14: end => 15: end 16: 17: def show 18: @book = Book.find(params[:id]) 19: end (byebug) @book.errors.any? true (byebug) @book.errors.full_messages ["Name can't be blank", "Password can't be blank", "Password is too short (minimum is 5 characters)"] (byebug) Completed 200 OK in 249828ms (Views: 123.8ms | ActiveRecord: 0.2ms)

該当のソースコード

新規登録画面[books/new.html.slim]

- provide(:title, 'Create a Nikki') h1 日記を作ろう p 君たちの日記を作ろう。 = form_with model: @book do |f| == render 'shared/error_messages' = f.label :name, '日記のタイトル' = f.text_field :name, class:'form-control' = f.label :password, 'パスワード' = f.password_field :password, class:'form-control' = f.label :password_confirmation, 'パスワード(確認)' = f.password_field :password_confirmation, class:'form-control' = f.submit 'つくる', class: 'btn btn-prymary'

エラーメッセージ用パーシャル[shared/_error_messages.html.slim]

- if @book.errors.any? #error_explanation .alert.alert-danger = @book.errors.count '個のエラー ul - @book.errors.full_messages.each do |msg| li = msg

booksコントローラー[controllers/books_controller.rb]

class BooksController < ApplicationController def new @book = Book.new end def create @book = Book.new(books_params) if @book.save flash[:success] = "日記を作りました" redirect_to @book else render 'new' debugger end end def show @book = Book.find(params[:id]) end def destroy end private def books_params params.require(:book).permit(:name, :password, :password_confirmation) end end

bookモデル[models/book.rb]

class Book < ApplicationRecord validates :name, presence: true, length: { maximum: 30 } has_many :post, dependent: :destroy has_many :user, dependent: :destroy has_secure_password validates :password, presence: true, length: { minimum: 5 } end

補足情報(FW/ツールのバージョンなど)

rails 5.2.3
ruby 2.6.3p62

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mugheart

2019/07/23 05:58

エラーメッセージ用パーシャルってどこにレンダリングしてますか? 提示されたコードの中には見当たらないように思えますが...。
natecosan

2019/07/23 06:19

新規登録画面[books/new.html.slim]のフォーム直下に == render 'shared/error_messages' でレンダリングしています!
Mugheart

2019/07/23 06:25

ほんとだ、見落としてました...。
guest

回答1

0

ベストアンサー

slim

1
  • @book.errors.full_messages.each do |msg|

li = msg

インデントが抜けてるからかな。

slim

1- @book.errors.full_messages.each do |msg| 2 li = msg

もう1箇所

slim

1

.alert.alert-danger = @book.errors.count
'個のエラー

これだと.alert.alert-dangerのタグは= @book.errors.countで閉じます。

slim

1.alert.alert-danger 2 = @book.errors.count 3 '個のエラー

追加
そもそもAjaxで通信されていることを想定していない(?)
form_forと同じ感覚で使っているなら多分これ。

slim

1

= form_with model: @book do |f|

slim

1= form_with model: @book, local: true do |f|

投稿2019/07/23 06:25

編集2019/07/23 08:15
Mugheart

総合スコア2342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natecosan

2019/07/23 06:40

ご指摘ありがとうございます、しかしインデントを修正してみたのですが、変わりませんでした・・・!
natecosan

2019/07/23 08:10 編集

もう一つのインデントも直したのですが、ダメでした。。。
natecosan

2019/07/23 08:22

ありがとうございます!!これで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問