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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

686閲覧

rails フォームを空欄にした際のエラー表示ができない

railsganbaruman

総合スコア16

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/05 09:18

前提・実現したいこと

ruby on railsで、本のタイトル、内容をフォームで記述できるようにした。
タイトルまたは内容フォームを空欄にした際のそのページでエラー表示する機能を実装したい。
フォームを記述したページでエラーメッセージを出力するようrenderを呼んだがインスタンスがnilになっていてeachメソッドが使用できない。
なぜnilになってしまっているか分からない。renderはインスタンスを読み込まないのでしょうか?

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

イメージ説明

NoMethodError

該当のソースコード

routes.rb

Rails.application.routes.draw do root 'books#top' resources :books # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end

book_controller.rb

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

book.rb

class Book < ApplicationRecord validates :title , presence: true validates :body , presence: true end

index.html.erb

<table> <tr> <th>Title</th> <th>Body</th> <th></th> </tr> <% @books.each do |book| %> <tr> <th> <%= book.title %> </th> <th> <%= book.body %> </th> <th> <%= link_to "Show",book_path(book) %> <%= link_to "Edit",edit_book_path(book) %> <%= link_to "Destroy",book_path(book) , method: :delete %> </th> </tr> <% end %> </table> <h1>New book</h1> <%= form_for(@book) do |f| %> <% if @book.errors.any? %> <h2><%= pluralize(@book.errors.count, "error") %> prohibited this article from being saved:</h2> <ul> <% @book.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> <% end %> <%= f.label :title%> <%= f.text_field :title%> <br> <%= f.label :body%> <%= f.text_area :body%> <%= f.submit%> <%end%>

show.html.erb

<p><span class="bold">title: </span><%= @book.title %></p> <p><span class="bold">body: </span><%= @book.body%></p> <%= link_to "Back",books_path%> <%= link_to "Edit",edit_book_path(@book)%>

edit.html.erb

<h1>Editing Book</h1> <%= form_for(@book) do |f| %> <% if @book.errors.any? %> <h2><%= pluralize(@book.errors.count, "error") %> prohibited this article from being saved:</h2> <ul> <% @book.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> <% end %> <%= f.label :title%> <%= f.text_field :title%> <br> <%= f.label :body%> <%= f.text_area :body%> <%= f.submit%> <%end%> <%= link_to "Back",books_path%> <%= link_to "Edit",edit_book_path(@book)%>

top.html.erb

<h1>ようこそ、Bookersへ!</h1> <p> <span class="bold">Bookers</span>では、さまざまな書籍に関するあなたの意見や<br> 印象を共有し交換することができます </p> <%=link_to "start",books_path%>
Rails 6.0.2.2 ruby 2.6.3p62

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜnilかというと、controllerで定義して渡していないからです。
def create book = Book.new(book_params) if book.save redirect_to book_path(book.id) else render 'index' end end
のなかにどこにも @booksを定義していないですね。
elseのところで @books.Book.all を入れてください

投稿2020/05/05 11:11

winterboum

総合スコア23567

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

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

railsganbaruman

2020/05/05 13:11

renderでindex呼び出した際、indexアクション内のインスタンス変数は呼び出されないのですね。回答ありがとうございます。解決しました。
winterboum

2020/05/05 13:14

Webアプリはブラウザーからのリクエスト毎にやり直しなので、indexの時の変数はindexの結果をブラウザーに返した時点で忘れられています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問