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

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

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

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

Q&A

2回答

827閲覧

【Ruby on Rails】NoMethodErrorへの対処方法

shuta-a

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2021/12/14 14:32

バリデーションを作成している最中なのですが、NoMethodErrorの原因がわかりません。

shutaコントローラです↓

Rails

1class ShutaController < ApplicationController 2 def new 3 @book = Book.new 4 end 5 6 7 def index 8 @books = Book.all 9 end 10 11 def show 12 @book = Book.find(params[:id]) 13 end 14 15 def create 16 @book = Book.new(book_params) 17 if @book.save 18 redirect_to shutax_path(@book.id) 19 flash[:notice] = "Book was successfully created" 20 else 21 render :new 22 end 23 end 24 25 def edit 26 @book = Book.find(params[:id]) 27 end 28 29 def update 30 book = Book.find(params[:id]) 31 book.update(book_params) 32 redirect_to shutax_path(book.id) 33 flash[:notice] = "Book was successfully updated" 34 end 35 36 def destroy 37 book = Book.find(params[:id]) 38 book.destroy 39 redirect_to index_path 40 end 41 42 43 44 private 45 46 def book_params 47 params.permit(:title, :body) 48 end 49 50end 51

index.html.erbのコードです↓

<h1>Books</h1> <table class="table"> <thead> <tr> <th>Title</th> <th>Body</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @books.each do |book| %> <tr> <td> <%= book.title %> </td> <td> <%= book.body %> </td> <td> <%= link_to "Show", shutax_path(book.id) %> <%= link_to "Edit", edit_shutax_path(book.id) %> <%= link_to "Destroy", destroy_shutax_path(book.id), method: :delete %> </td> </tr> <% end %> </tbody> </table> <h1>New book</h1> <% if @book.errors.any? %> <%= @book.errors.count %>件のエラーが発生しました <% @book.errors.full_messages.each do |message| %> <%= message %> <% end %> <% end %> <%= form_with model: @book, url:'/books', local:true do |f| %> <h4>Title</h4> <%= f.text_field :title %> <h4>Body</h4> <%= f.text_area :body %> <%= f.submit 'Create Book' %> <% end %>

エラーの内容です↓

イメージ説明

shutaコントローラのindexアクションに問題があるのは分かるのですが、@booksや@bookに変更してみてもエラーが消えません。
なにが原因なのか、ご教授お願いします。

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

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

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

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

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

guest

回答2

0

新規作成するために、@bookを定義する必要があります。

ruby

1@book = Book.new

投稿2021/12/14 21:55

maisumakun

総合スコア145183

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

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

maisumakun

2021/12/14 21:56

もっとも、入力にエラーがあった場合の再表示はcreateが行う以上、indexサイドのエラー表示が有効となる場面はなさそうですので、エラー表示処理ごと外してもいいかもしれません。
shuta-a

2021/12/14 22:41

ありがとうございます。ご指摘通りindexアクションで@book変数の定義して色々変えたら、エラーは消えました。
guest

0

今回は変数名のミスかなと。

コントローラでは、@booksにレコードを代入しています。

ruby

1def index 2 @books = Book.all 3end

エラーとなったビューの行では、

ruby

1<% if @book.errors.any? %>

と書いています。
@booksは存在するが、@bookは存在しないのでnilとなり、nilにはerrorsというメソッドはないのでエラーとなります。
なので、@bookではなく、@booksに修正したら解決するのではないでしょうか・

投稿2021/12/14 14:49

mingos

総合スコア4025

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

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

shuta-a

2021/12/14 14:56

ご指摘いただいた通り、@booksに直したのですが、同じくerrorsのところでエラーが出てしまいます。 indexアクションに@bookを定義するのも考えましたが、どのようなメソッドを付けて定義すればよいのか悩んでおります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問