プログラミング初学者になります。
初めての質問になります。よろしくお願いします。
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー