🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

1回答

1972閲覧

バリデーションは効いているがエラーメッセージが出ない

juraru

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

0クリップ

投稿2021/02/12 21:11

Rails1週間のド素人です…
Railsで本の登録を行うシステムを作っています。
タイトルと内容が空白の際、バリデーションで弾きエラーメッセージを表示する機能を実装したいのですがエラーメッセージが表示されません。

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

createアクションでバリデーションチェック後、画面遷移の後エラーメッセージが表示されない

該当のソースコード

ruby

1/Bookers/app/controllers/books_controller.rb 2 3class BooksController < ApplicationController 4 protect_from_forgery :except => [:create] 5 6 def top 7 end 8 9 def book 10 @books=Book.all 11 @book=Book.new 12 end 13 14 def create 15 book = Book.new(book_params) 16 if book.save 17 flash[:notice]="Book was successfully created" 18 redirect_to books_path 19 else 20 @books=Book.all 21 @book=Book.new(book_params) 22 render "book" 23 end 24 end 25 26 def show 27 @book=Book.find(params[:id]) 28 end 29 30 def edit 31 @book=Book.find(params[:id]) 32 end 33 34 def destroy 35 book = Book.find(params[:id]) 36 book.destroy 37 flash[:notice]="Book was successfully destroyed" 38 redirect_to books_path 39 end 40 41 def update 42 book = Book.find(params[:id]) 43 book.update(book_params) 44 flash[:notice]="Book was successfully updated" 45 redirect_to books_path(book.id) 46 end 47 48 private 49 def book_params 50 params.require(:book).permit(:title, :body) 51 end 52end

ruby

1/Bookers/app/views/books/book.html.erb 2 3 <% if flash[:notice] %> 4 <p class="s-text" id="notice"> 5 <%= flash[:notice] %> 6 </p> 7 <% end %> 8<h1>Booker</h1> 9<h4>投稿一覧</h4> 10<div class ="book-wrap"> 11 12<table> 13 <tr> 14 <th class="title1">title</th> 15 <th class="body1">body</th> 16 </tr> 17</div> 18<%@books.each do |book|%> 19 <div class ="book-wrap"> 20 <tr> 21 <td class="book-title"><%=book.title%></td> 22 <td class="book-body"><%=book.body%></td> 23 <td class="link-menu"><%=link_to "Show",show_books_path(book)%></td> 24 <td class="link-menu"><%=link_to "Edit",edit_books_path(book)%></td> 25 <td class="link-menu"><%=link_to "Destroy",destroy_books_path(book),method: :delete ,data: {confirm: "Are you sure?"}%></td> 26 </tr> 27 </div> 28</table> 29<%end%> 30 31 32 33<h2>New book</h2> 34<%=form_with model:@book,url:"books",local:true do |f|%> 35<p> 36<%= render 'layouts/error_messages', model: f.object%> 37</p> 38 <h4>タイトル</h4> 39 <%= f.text_field :title %> 40 <h4>本文</h4> 41 <%= f.text_area :body %> 42 <%= f.submit '投稿' %> 43<%end%>

ruby

1/Bookers/app/views/layouts/_error_messages.html.erb 2 3<% if model.errors.any? %> 4 <div class="alert alert-warning"> 5 <ul> 6 <% model.errors.full_messages.each do |message| %> 7 <li><%= message %></li> 8 <% end %> 9 </ul> 10 </div> 11<% end %>

ruby

1/Bookers/app/models/book.rb 2 3class Book < ApplicationRecord 4 validates :title,presence: true 5 validates :body,presence: true 6end 7

試したこと

ここのバリデーションチェックの質問を読み、レイアウト部のmodelを@bookに変えて試したりしたのですが上手く行きませんでした。
レコードに登録はされていないのでバリデーションは効いており、createアクションの@book周りが怪しいと思うのですが、そこからいくら調べても分からなくなってしまいました。
長くなってしまいましたがどうかご教授お願い致します。

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

railsのバージョンは5.2.4です。

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

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

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

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

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

m.ts10806

2021/02/12 21:20

もともと、何を元にこのコードを書いたのでしょうか。 あと、そもそもcreateを通っているかどうかデバッグしてみましたか?
juraru

2021/02/12 22:22

解決しました!createのelse部分に記述されていた@bookの記述を消し、初めに記述したbookを@bookに直すことが必要だったようです!
m.ts10806

2021/02/12 23:20

質問は編集できます。 コメントで指摘されたことは原則として質問本文を編集してお返しください。
guest

回答1

0

ベストアンサー

else で @book=Book.new(book_params) し直してるからです。
このぎょうをけして、素の book を @bookになおして。

投稿2021/02/12 22:02

winterboum

総合スコア23567

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

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

juraru

2021/02/12 22:16

出来ました!!ありがとうございます!! 再定義したことでerrorの中身が消えてしまっていたと考えて良いのでしょうか?
winterboum

2021/02/13 04:22

消えたのではなく、新しい方は未だエラーチェックしていないのでエラー文が無いんです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問