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

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

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

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

Q&A

解決済

1回答

2056閲覧

renderを使いerror_messageを表示したい

komai

総合スコア2

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/06 12:52

renderを使いerror_messageを表示

保存に失敗した際にrenderを使いerror_messageを表示したいのですが、以下のエラーメッセージが発生しました。いくつか方法を試してみましたがうまくいかず、ご教授願いたいです。

NoMethodError in Books#create

ActionView::Template::Error (undefined method `each' for nil:NilClass): 9: </tr> 10: </thead> 11: <tbody> 12: <% @books.each do |book| %> 13: <tr> 14: <td><%= book.title %></td> 15: <td><%= book.body %></td>

該当のソースコード

Rails

1class BooksController < ApplicationController 2 def top 3 end 4 5 def index 6 @books = Book.all 7 @book = Book.new 8 end 9 10 def create 11 book = Book.new(book_params) 12 if book.save 13 flash[:notice] = "Book was successfully created." 14 redirect_to book_path(book.id) 15 else 16 render :index 17 # renderだとうまくいかない?indexの繰り返し処理の@booksがnilになっている? 18 # redirect_toにするとindexに遷移するようになったが、error_messageが表示されない 19 end 20 end 21 22 def show 23 @book = Book.find(params[:id]) 24 end 25 26 def edit 27 @book = Book.find(params[:id]) 28 end 29 30 def update 31 book = Book.find(params[:id]) 32 if book.update(book_params) 33 flash[:notice] = "Book was successfully updated." 34 redirect_to book_path(book.id) 35 else 36 render :show 37 # ここもredirect_toで指定して遷移させればいいのか? 38 end 39 end 40 41 def destroy 42 book = Book.find(params[:id]) 43 book.destroy 44 flash[:notice] = "Book was successfully destroyed." 45 redirect_to books_path 46 end 47 48 private 49 def book_params 50 params.require(:book).permit(:title, :body) 51 end 52end 53

index

1<table> 2 <thead> 3 <tr> 4 <th>Title</th> 5 <th>Body</th> 6 </tr> 7 </thead> 8 <tbody> 9 <% @books.each do |book| %> 10 <tr> 11 <td><%= book.title %></td> 12 <td><%= book.body %></td> 13 <td><%= link_to "Show", book_path(book.id) %></td> 14 <td><%= link_to "Edit", edit_book_path(book.id)%></td> 15 <td><%= link_to "Destroy", book_path(book.id), method: :delete, "data-confirm" => "Are you sure?" %></td> 16 </tr> 17 <% end %> 18 </tbody> 19 </table> 20 21<%= form_for(@book) do |f| %> 22 <% if @book.errors.any? %> 23 <div id="error_explanation"> 24 <h2><%= @book.errors.count %> errors prohibited this book from being saved:</h2> 25 <ul> 26 <% @book.errors.full_messages.each do |message| %> 27 <li><%= message %></li> 28 <% end %> 29 </ul> 30 </div> 31 <% end %> 32 <div class=field> 33 <label for="book_title">Title</label> 34 <%= f.text_field :title %> 35 </div> 36 <div class="field"> 37 <label for="book_body">Body</label> 38 <%= f.text_area :body %> 39 </div> 40 <%= f.submit "Create Book" %> 41<% end %> 42 43

試したこと

createアクションにて保存に失敗した際の処理としてredirect_toを使うと、index.html.erbへ遷移することは確認できましたが、それだと空のモデルが渡されるためにフォームに入力前の状態に戻る?
each文の@booksがnilのためrenderの前に定義が必要なのかと思い、@books = Book.newを入れてみたがうまくいかない(←これが間違っているのか?)

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

create と update にて
else @books = Book.all render :index end
としてください

投稿2020/05/07 05:49

winterboum

総合スコア23567

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

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

komai

2020/05/07 07:13

ご回答ありがとうございます。 助言いただいた通りに記述し、併せてcreateアクションとupdateアクションで定義しているインスタンス変数に@を追加したところうまくいきました。恐らくviewで表示しなければならないので@が必要なんですね。 初歩的なところなのでしょうが、理解できました。ありがとうございました!
winterboum

2020/05/07 07:21 編集

今回の本質は viewで使っている @booksが定義されていなかったことです。 @books=Book.newでも定義されているとは言えますが、、、 viewで必要としているのは Bookの登録済のものの集まりなので、Book.new(ひとつだけ)では eachでエラーになります
komai

2020/05/07 07:41

elseの下で再度@books=book.allでデータを取得しなければ、index.html.erbのeach文のところが表示できない。なぜならeach文では全てのデータを必要としているから、Book.new(ひとつだけ)ではダメということですね。
winterboum

2020/05/07 08:28

はい 正確には 一つだからだめ なのではなく 一つしか入れられない入れ物だから だめ です。 Book.allした結果一つも無くても、複数入れられる入れ物なので OK です
komai

2020/05/07 14:59

なるほど、参考になります! 正確な部分まで教えていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問