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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

731閲覧

ruby on rails でのエラーメッセージの出し方について

hiroshiga

総合スコア4

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/05 06:31

空欄でデータが送られたときにエラーメッセージを出力する

ruby on rails の勉強をし始めて二週間程度の初学者です。今回indexとnewを同じ画面で表示するという課題をやっているのですが、うまくできません。
具体的にはデータが空で送られたときにデータを保存しないようにモデルの設定はできたのですが、エラーメッセージがどうしても出力されません。
わかりづらいかもしれませんがよろしくお願いいたします。

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

NoMethodError in Books#create undefined method `each' for nil:NilClass

books_controller.rb

class BooksController < ApplicationController def index @book = Book.new @books = Book.all end def show @book = Book.find(params[:id]) end def edit @book = Book.find(params[:id]) end def home end def create book = Book.new(book_params) book.save # 保存失敗して if book.id == nil @book = Book.new @books = Book.all render 'index' else redirect_to book_path(book.id) end end def destroy book = Book.find(params[:id]) book.destroy redirect_to books_path end def update book = Book.find(params[:id]) book.update(book_params) redirect_to book_path(book) end private def book_params params.require(:book).permit(:title, :body) end end

index.html.rb

<h1>Books</h1> <table> <thead> <tr> <th>Title</th> <th>Body</th> <th></th> </tr> </thead> <tbody> <% @books.each do |post| %> <tr> <td> <%= post.title %> </td> <td> <%= post.body %> </td> <td> <%= link_to "Show", book_path(post.id) %> </td> <td> <%= link_to "Edit", edit_book_path(post.id) %> </td> <td> <%= link_to "Destroy", book_path(post.id), method: :delete, "data-confirm" => "Are you sure?" %> </td> </tr> <% end %> </tbody> </table> <h2>New book</h2> <!-- form_for部分 --> <%= form_for(@book) do |f| %> <h5>Title</h5> <%= f.text_field :title %> <h5>Body</h5> <%= f.text_area :body %> <br><%= f.submit 'Create Book' %></br> <% end %> <% @book.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %>

試したこと

おそらく@booksと@bookがnilだと思い、books_controller.rbに@book = Book.newと@books = Book.allを追加しましたが、レンダーされるだけでエラー文の表示には至りませんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

の関連性がわかりませんので、
これを無視して、

erb

1<% @book.errors.full_messages.each do |message| %> 2 <li><%= message %></li> 3<% end %>

こちらにエラーメッセージを出すということを考えた場合、
下記のようにコントローラーを変更したら、
エラーメッセージが表示できると思いますが、どうでしょうか。

Ruby

1 def create 2 @book = Book.new(book_params) 3 @book.save # 保存失敗して 4 if @book.id == nil 5 # @book = Book.new # 削除 6 @books = Book.all 7 render 'index' 8 else 9 redirect_to book_path(@book.id) 10 end 11 end 12

投稿2020/07/05 06:49

Cojiro

総合スコア539

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

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

hiroshiga

2020/07/05 07:05

回答ありがとうございます。 ずっと悩んでいましたが表示されとてもうれしいです。 あっているのかわからないのですがdef createの部分のbookという変数を インスタンス変数にすることでviewに@book=nilが送られ、エラーメッセージが表示できるようになったということでしょうか。
hiroshiga

2020/07/08 09:45

ありがとうございます。とても参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問