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

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

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

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

Q&A

解決済

1回答

563閲覧

エラーメッセージをindexページに表示したい

isd_kisk

総合スコア15

Ruby

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

0グッド

0クリップ

投稿2021/07/11 04:41

編集2021/07/11 04:46
簡易的なブログサイトを製作しています。そのなかで、投稿欄の片方にしか、入力されなかった際にエラーメッセージを出力したいのですが、その際に出力させるページをindex.html.erbにしたいです。今の段階だと、new.html.erbに表示されています。、 ### 発生している問題・エラーメッセージ index.html.erbに表示させようとすると エラーメッセージ NoMethodError in Books#create Showing /home/ec2-user/environment/bookers/app/views/books/index.html.erb where line #9 raised: undefined method `each' for nil:NilClass と表示されます

ruby

1books_controller.rb 2 3class BooksController < ApplicationController 4 5 def top 6 end 7 8 def index 9 @books = Book.all 10 end 11 12 def show 13 @book = Book.find(params[:id]) 14 end 15 16 def new 17 @book = Book.new 18 end 19 20 def create 21 @book = Book.new(book_params) 22 if @book.save 23 flash[:notice] ="Book was successfully created." 24 redirect_to book_path(@book) 25 else 26 render "new" 27 end 28 end 29 def edit 30 @book = Book.find(params[:id]) 31 end 32 33 def update 34 @book = Book.find(params[:id]) 35 if @book.update(book_params) 36 flash[:notify] = "Book was successfully updated." 37 redirect_to book_path(@book) 38 else 39 render "index" 40 end 41 end 42 43 def destroy 44 @book = Book.find(params[:id]) 45 @book.destroy 46 if @book.destroy 47 flash[:message] = "Book was successfully destroyed." 48 redirect_to books_path 49 end 50 end 51 private 52 def book_params 53 params.permit(:title, :body) 54 end 55end 56
index.html.erb <h1>Books</h1> <div class = "wrapp"> <table> <tr> <td class = "data">Title</td> <td class = "data1">Body</td> </tr> <% @books.each do |book| %> <tr> <td><%= book.title %></td> <td><%= book.body %></td> <td><%= link_to 'Show', book_path(book.id), method: :get %></td> <td><%= link_to 'Edit', book_path(book.id), method: :get %></td> <td><%= link_to 'destroy',book_path(book.id),method: :delete, data: {confirm:"Are you sure?"}%></td> </tr> <% end %> </table> <%= form_with model:@book, local:true do |f| %> <h1>New book</h1> <h4>Title</h4> <%= f.text_field :title %> <h4>Body</h4> <%= f.text_area :body %> <%= f.submit 'create book' %> <% end %> </div>
new.html.erb <h1>Books</h1> <div class = "wrapp"> <table> <tr> <td class = "data">Title</td> <td class = "data1">Body</td> </tr> <% @books.each do |book| %> <tr> <td><%= book.title %></td> <td><%= book.body %></td> <td><%= link_to 'Show', book_path(book.id), method: :get %></td> <td><%= link_to 'Edit', book_path(book.id), method: :get %></td> <td><%= link_to 'destroy',book_path(book.id),method: :delete, data: {confirm:"Are you sure?"}%></td> </tr> <% end %> </table> <%= form_with model:@book, local:true do |f| %> <h1>New book</h1> <h4>Title</h4> <%= f.text_field :title %> <h4>Body</h4> <%= f.text_area :body %> <%= f.submit 'create book' %> <% end %> </div>
config.rb Rails.application.routes.draw do resources :books delete 'books/:id', to: 'books#destroy' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root to: 'books#top' end

試したこと

books_controllerのcreateアクションのrenderをnewにすると、エラーメッセージは表示されるのですが、indexページ上で反映されません。(当たり前ですが。)。renderをindexにすると、エラーが起こるので、indexページに何か問題があるのは分かるのですが、具体的に何が問題なのかが分かりません。このエラーが3日間くらい解消されないので、ご教示いただきたいです。

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

cloud9で実装してます

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

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

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

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

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

m.ts10806

2021/07/11 06:11

既に投稿された質問で完結させてください。 こちらの質問は削除依頼を。
guest

回答1

0

ベストアンサー

renderは指定したページを表示するだけです。indexのactionを呼び出しているわけではなく、view(index.html.erb)を呼び出しているだけなので、呼び出したindexの中にある@booksの中身がnilのためeachできないのでエラーが出ています。
とりあえずエラーが出ない方法だと下記になるかと思います。

ruby

1 def create 2 . 3 . 4 . 5 6 else 7                @books = Book.all 8 render :index 9 end 10 end 11

あとはview側でエラーメッセージを表示させる記載すれば、index画面上でもエラー表示可能です。

投稿2021/07/12 00:31

編集2021/07/12 00:35
J_O

総合スコア143

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

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

isd_kisk

2021/07/13 09:51

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問