前提
Ruby on railsで本の感想を投稿するアプリを作っています。
新規投稿、詳細画面の表示、投稿の編集、削除までは正常にできており、空欄で投稿したときのエラーメッセージの表示ができず困っています。ほかの方の質問を参考にエラーメッセージのやcontrollerのアクションを少しいじったところなぜか編集のほうでは空欄投稿時のエラーメッセージの投稿がうまくいきました。
しかし、createアクションを使用しての投稿一覧、新規投稿画面(同じ画面)でのエラーメッセージの表示がうまくいきません。下記のコードでは空欄で投稿するとエラーはな発生せず同じ画面が表示され何度やっても無限ループになります。
以下のエラーメッセージはRspecによるテストでエラーになっている部分です。
なお3,4,のエラーについてですが投稿に失敗した際の処理に関する要件はなく、また削除は正常にできるのでなぜ発生するか不明です。
いろいろ調べて試行錯誤しましたがどうしても解決せず、困っているのでご教示いただけないでしょうか。
実現したいこと
新規投稿において空欄で投稿した際のエラーメッセージの表示
発生している問題・エラーメッセージ
1) Book モデルに関するテスト titleを空白で投稿した場合に画面にエラーメッセージが表示されているか エラーメッセージは正しく表示されるか Failure/Error: expect(page).to have_content "can't be blank" expected to find text "can't be blank" in "Books\ntitle body\nNew book\nTitle\nBody" # ./spec/models/book_spec.rb:30:in `block (3 levels) in <top (required)>' 2) Book モデルに関するテスト bodyを空白で投稿した場合に画面にエラーメッセージが表示されているか エラーメッセージは正しく表示されるか Failure/Error: expect(page).to have_content "can't be blank" expected to find text "can't be blank" in "Books\ntitle body\nNew book\nTitle\nBody" # ./spec/models/book_spec.rb:40:in `block (3 levels) in <top (required)>' 3) 投稿のテスト 一覧画面のテスト 投稿処理に関するテスト 投稿に失敗する Failure/Error: expect(page).to have_content 'error' expected to find text "error" in "Books\ntitle body hoge body show edit destroy\nNew book\nTitle\nBody" # ./spec/system/books_spec.rb:64:in `block (4 levels) in <main>' 4) 投稿のテスト 一覧画面のテスト book削除のテスト bookの削除 Failure/Error: click_link 'Destroy', match: :first Capybara::ElementNotFound: Unable to find link "Destroy" # /home/ec2-user/.rvm/gems/ruby-3.1.2/gems/capybara-3.37.1/lib/capybara/node/finders.rb:310:in `block in synced_resolve' # /home/ec2-user/.rvm/gems/ruby-3.1.2/gems/capybara-3.37.1/lib/capybara/node/base.rb:83:in `synchronize' # /home/ec2-user/.rvm/gems/ruby-3.1.2/gems/capybara-3.37.1/lib/capybara/node/finders.rb:299:in `synced_resolve' # /home/ec2-user/.rvm/gems/ruby-3.1.2/gems/capybara-3.37.1/lib/capybara/node/finders.rb:60:in `find' # /home/ec2-user/.rvm/gems/ruby-3.1.2/gems/capybara-3.37.1/lib/capybara/node/actions.rb:42:in `click_link' # /home/ec2-user/.rvm/gems/ruby-3.1.2/gems/capybara-3.37.1/lib/capybara/session.rb:771:in `click_link' # /home/ec2-user/.rvm/gems/ruby-3.1.2/gems/capybara-3.37.1/lib/capybara/dsl.rb:52:in `call' # /home/ec2-user/.rvm/gems/ruby-3.1.2/gems/capybara-3.37.1/lib/capybara/dsl.rb:52:in `click_link' # ./spec/system/books_spec.rb:88:in `block (4 levels) in <main>'
該当のソースコード
book.controller.erb
1class BooksController < ApplicationController 2 def index 3 @books = Book.all 4 @book = Book.new 5 end 6 7 def create 8 book = Book.new(book_params) 9 10 if book.save 11 flash[:notice] = "Book was successfully created." 12 redirect_to book_path(book) 13 else 14 @books = Book.all 15 @book = Book.new 16 render :index 17 end 18 end 19 20 def show 21 @book = Book.find(params[:id]) 22 end 23 24 def edit 25 @book = Book.find(params[:id]) 26 end 27 28 def update 29 @book = Book.find(params[:id]) 30 if @book.update(book_params) 31 flash[:notice] = "Book was successfully updated." 32 redirect_to book_path(@book) 33 else 34 @books = Book.all 35 render :edit 36 end 37 end 38 39 def destroy 40 book = Book.find(params[:id]) 41 book.destroy 42 redirect_to books_path 43 end 44 45 private 46 def book_params 47 params.require(:book).permit(:title, :body) 48 end 49end
routes.rb
1Rails.application.routes.draw do 2 3 root to: 'homes#top' 4 5 resources :books 6 7 # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html 8end 9
book.rb
1class Book < ApplicationRecord 2 3 validates :title, presence: true 4 validates :body, presence: true 5end 6
index.html.erb
1<body class="index-body"> 2 <h2>Books</h2> 3 4 <table> 5 <thead> 6 <tr> 7 <th>title</th> 8 <th>body</th> 9 <th></th> 10 </tr> 11 </thead> 12 <tbody> 13 <% @books.each do |book| %> 14 <tr> 15 <td class="posted-title"><%= book.title %></td> 16 <td class="posted-body"><%= book.body %></td> 17 <td class="link-show"><%= link_to "show", book_path(book.id) %></td> 18 <td class="link-edit"><%= link_to "edit", edit_book_path(book.id) %></td> 19 <td class="link-destroy"><%= link_to "destroy", book, method: :delete, "data-confirm" => "Are you sure?" %></td> 20 </tr> 21 <% end %> 22 </tbody> 23 </table> 24 25 26 <h2 class="new-title">New book</h2> 27 <%= form_with model: @book, url: '/books', method: :post, local: true do |f| %> 28 29 <% if @book.errors.any? %> 30 <div id="error_explanation"> 31 <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2> 32 <ul> 33 <% @book.errors.full_messages.each do |message| %> 34 <li><%= message %></li> 35 <% end %> 36 </ul> 37 </div> 38 <% end %> 39 40 <h6>Title</h6> 41 <%= f.text_field :title, class: 'new-subtitle' %> 42 43 <h6>Body</h6> 44 <%= f.text_area :body, class: 'new-subbody' %> 45 46 <%= f.submit 'Create Book' %> 47 <% end %> 48</body>
show.html.erb
1 2<div class="show-contents"> 3 <div class="show-text success-message"> 4 <%= flash[:notice]%> 5 </div> 6 7 <h6 class="show-text">Title: <%= @book.title %></h6> 8 <h6 class="show-text">Body: <%= @book.body %></h6> 9</div> 10 11<p class="link-others"><%= link_to "Edit", edit_book_path(@book.id)%> | <%=link_to 'Back', books_path %></p> 12
edit.html.erb
1 <div class="edit-contents"> 2 3 <h1 class="edit-subject">Editing Book</h1> 4 5 6 7 <%= form_with model: @book, url: book_path(@book.id), method: :patch, local: true do |book| %> 8 <% if @book.errors.any? %> 9 <div id="error_explanation"> 10 <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2> 11 <ul> 12 <% @book.errors.full_messages.each do |message| %> 13 <li><%= message %></li> 14 <% end %> 15 </ul> 16 </div> 17 <% end %> 18 19 <div class="edit-content"> 20 <p class="edit-name">Title</p> 21 <%= book.text_field :title %> 22 </div> 23 24 <div class="edit-content"> 25 <p class="edit-name">Boby</p> 26 <%= book.text_area :body %> 27 </div> 28 29 <div class="update-btn"><%= book.submit 'Update Book' %></div> 30 31 <% end %> 32 33 <p><%= link_to "show", book_path(@book.id) %> | <%=link_to 'Back', books_path %></p> 34 35</div>
試したこと
うまくいっている投稿編集画面でのエラーメッセージではBook.allの情報を取得しているようなので新規投稿のほうのエラーメッセージを表示するコードの部分でもBook.allを取得するよう@book→@booksに書き換えるとエラーが発生する。
createアクションのelseの部分でインスタンス変数の@books = Book.allを消すと
Undefined method 'errors' for nilというエラーが発生する
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/21 15:47 編集
2022/10/21 16:06