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

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

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

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

Q&A

解決済

1回答

994閲覧

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

isd_kisk

総合スコア15

Ruby

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

0グッド

0クリップ

投稿2021/07/10 02:36

編集2021/07/11 06:03

前提・実現したいこと

簡易的なブログサイトを製作しています。そのなかで、投稿欄の片方にしか、入力されなかった際にエラーメッセージを出力したいのですが、その際に出力させるページを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
と表示されます

class BooksController < ApplicationController def top end def index @books = Book.all end def show @book = Book.find(params[:id]) end def new @book = Book.new end def create @book = Book.new(book_params) if @book.save flash[:notice] ="Book was successfully created." redirect_to book_path(@book) else render "new" end end def edit @book = Book.find(params[:id]) end def update @book = Book.find(params[:id]) if @book.update(book_params) flash[:notify] = "Book was successfully updated." redirect_to book_path(@book) else render "index" end end def destroy @book = Book.find(params[:id]) @book.destroy if @book.destroy flash[:message] = "Book was successfully destroyed." redirect_to books_path end end private def book_params params.permit(:title, :body) end end
***__*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**__ <%= form_with model:@book, local:true do |f| %> <% if @book.errors.any? %> <div class = "title"> <ul> <h3><span = class = "warn"><%= @book.errors.count %> error prohibited this book from being saved:</h3> <h3><% @book.errors.full_messages.each do |message| %></h3> <li><%= message %></li> <% end %> </ul> </div> <% end %> <% end %>
```**__routes.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ページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

プログラムは <code>を使って載せ直してください。ベタに書かれると読みにくいです。⇒ 回答つきにくい。

なぜindexに、、とおもうのですが それは置いておいて
render "new" に変えて render "index" としたのですね?
そうしますと、view indexで使う @books が未定義なのでそのエラーとなります。
def index で定義しているインスタンス変数を一揃い定義してください

投稿2021/07/10 09:42

winterboum

総合スコア23567

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

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

isd_kisk

2021/07/10 12:18

Indexアクションに記述したものでは、定義されていることにはならないのでしょうか?ruby始めたばかりでよくわかってないのです…
winterboum

2021/07/10 13:49 編集

index アクションを通らないので、定義されたことになりません。 codeを <code>表記になおして
winterboum

2021/07/11 05:20

同じ内容の質問を複数建てることになるのでそれ、問題。 この質問を編集してください。
isd_kisk

2021/07/11 06:18

修正しました。 indexアクションを通すには具体的にどうすればいいのでしょうか。
winterboum

2021/07/11 06:55

通さないで、viewに必要な変数を定義してください
isd_kisk

2021/07/11 09:22

理解できました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問