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

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

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

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

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

1回答

6018閲覧

NoMethodErrorの解決策を教えていただきたいです。

hiroki_i

総合スコア1

Ruby

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

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

0クリップ

投稿2020/07/24 02:11

編集2020/07/24 02:49

プログラミング初学者になります。
初めての質問になります。よろしくお願いします。

Ruby on Railsで本の感想を投稿できるアプリを作っています。

投稿の実装はできましたが、投稿が空の場合にバリデーションが適用される実装がうまく反映されません。
実施したいのは、空の投稿があると、エラーメッセージが表示されることです。
indexページに投稿の全ての表示と、newの新規投稿フォームを同じページに配置しています。

その際、以下のエラーメッセージが発生しました。

イメージ説明

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

上記画像

該当のソースコード

class BooksController < ApplicationController def top end def index @books = Book.all @book = Book.new end def create book = Book.new(book_params) if book.save redirect_to book_path(book.id) else render :index end end def show @book = Book.find(params[:id]) end def edit @book = Book.find(params[:id]) end def update book = Book.find(params[:id]) book.update(book_params) flash[:notice] = "Book was successfully updated." redirect_to book_path(book.id) end def destroy book = Book.find(params[:id]) book.destroy flash[:notice] = "Book was successfully destroyed." redirect_to books_path end private def book_params params.require(:book).permit(:title, :body) end end
<h1>Books</h1> <table width="741px"> <thead> <tr> <th width="189px">Title</th> <th width="397px">Body</th> <th width="147px" colspan="3"></th> </tr> </thead> <tbody> <% @books.each do |book| %> <tr height="25px"> <td><%= book.title %></td> <td><%= book.body %></td> <td><%= link_to "Show", book_path(book.id) %></td> <td><%= link_to "Edit", edit_book_path(book.id) %></td> <td><%= link_to "Destroy", book_path(book.id), method: :delete, "data-confirm" => "Are you sure?" %></td> </tr> <% end %> </tbody> </table> <h2>New book</h2> <%= form_for(@book) do |f| %> <% if @book.errors.any? %> <%= @book.errors.count %>件のエラーが発生しました <% @book.errors.full_messages.each do |message| %> <%= message %> <% end %> <% end %> <h4>Title</h4> <%= f.text_field :title %> <h4>Body</h4> <%= f.text_area :body %> <div class="index-create-book"> <%= f.submit "Create Book" %> </div> <% end %>
class Book < ApplicationRecord validates :title, presence: true validates :body, presence: true end

試したこと

undefined method `each' for nil:NilClassを自分なりにメソッドがないということで調べましたが、
booksコントローラのcreateアクションでは定義できていると思いました。
validatesに問題があるのかとも考えましたが、空の投稿を阻止したいだけのため、特に問題ないと思います。
正直理解が乏しいため、createアクションのbookに@を付けたりと色々模索しましたが解決しませんでした。
投稿はできるが、エラー文でメソッドがない、定義されていないという理由が分かりませんでした。

一番理解の乏しい、index.htmlでエラーメッセージのform_for内のif文を使ってのエラーの表示に問題が
あるのかと考えましたが、自力では判断できませんでした。

説明が拙く申し訳ございませんが、ご教授いただけますでしょうか。

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

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

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

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

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

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

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

winterboum

2020/07/24 02:35

エラーが載っていないです
hiroki_i

2020/07/24 02:50

申し訳ございません。画像を添付させていただきました。ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

indexメソッドで行っていることをcreateメソッドでも行えばよいので

ruby

1 def create 2 @book = Book.new(book_params) 3 if @book.save 4 redirect_to book_path(@book.id) 5 else 6 @books = Book.all 7 render :index 8 end 9 end

投稿2020/07/24 03:10

asm

総合スコア15147

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

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

hiroki_i

2020/07/24 03:26

ありがとうございます。ただ、これでもやはり同じエラーになります。 私も@を付けてみたんですが、解決しませんでした。 elseの後に@books = Book.allは初めて試しましたが、同エラー。 @books = Book.allを加えて、@を外しても同エラーでした。
asm

2020/07/24 04:53 編集

まずはファイルを編集後にきちんと上書き保存している事およびファイル名などを間違えていない事を確認し それでもダメならばrailsの再起動を試すと改善する可能性があります。
hiroki_i

2020/07/24 05:47

再起動したらできました。理解が間違っているかもしれませんが、保存に失敗の際、elseで全ての投稿をインスタンス変数にしてviewに渡すために、createアクション内を全てインスタンス変数に変更する必要があると認識しました。 ここでずっと悩んでいたのでありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問