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

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

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

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

Ruby on Rails

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

Q&A

解決済

Ruby on railsでの空欄投稿のエラーメッセージ

kuro-to
kuro-to

総合スコア2

Ruby

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

Ruby on Rails

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

1回答

0グッド

1クリップ

346閲覧

投稿2022/10/21 13:04

前提

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/ツールのバージョンなど)

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

index.htmlで新規投稿のform_withとは別にバリデーションの判定を受け取るform_with(<%= form_with(model:@book, local: true) do |form| %>)を追記し、books_controllerのcreateアクション内でbookをインスタンス変数に変更、さらにelse内の@bookのインスタンス変数を削除したところ解決しました。ただし、修正後のコードでは空欄投稿をしていない状態でも、エラーがでるとエラーメッセージが表示される部分(New Bookの下)に謎の余白ができてしまいました。

投稿2022/10/21 15:44

kuro-to

総合スコア2

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

kuro-to

2022/10/21 15:47 編集

また、エラーメッセージの部分に記載した3,4のエラーですが、投稿の失敗に関するエラーは今回の修正とともに解決したので空欄投稿に関するものだったようです。削除に関するエラーについては解決していません。
kuro-to

2022/10/21 16:06

バリデーションの判定を受け取るform_withと記載しましたが、こちらは必要ありませんでした。また、New Bookテキストの下の余白ですが、このform_withによるものと、コード内に全角スペースが入ってしまっていることが原因でした。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails

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