前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー