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

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

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

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

Q&A

解決済

1回答

1641閲覧

Rspec で発生したエラーについて

oimo_KENPI

総合スコア10

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

0グッド

0クリップ

投稿2022/06/03 10:43

前提

初めての投稿のため、至らぬ記述等ありましたらご教授願います。

現在、「Bookers」というアプリケーションを作成しています。
本のタイトルとその本の内容を「投稿」「編集」「削除」の機能を持ったものです。
その他、必要に応じて別途投稿と一覧画面を行き来します。

ご教授願いたいこと

・Rspec で発生した5つのエラーの対応策
・エラー内容の簡単な詳細

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

・「rails s」を実行、ブラウザ上では各項目の挙動・動作、レイアウトは問題なく表示されている
・Rspec の際に以下の5つのエラーが発生した

ーー1つ目ーー Books GET /update returns http success Failure/Error: @book = Book.find(params[:id]) ActiveRecord::RecordNotFound: Couldn't find Book with 'id'=update ーー2つ目ーー Books GET /destroy returns http success Failure/Error: @book = Book.find(params[:id]) ActiveRecord::RecordNotFound: Couldn't find Book with 'id'=destroy ーー3つ目ーー Homes GET /top returns http success Failure/Error: get "/homes/top" ActionController::RoutingError: No route matches [GET] "/homes/top" ーー4つ目ーー 投稿のテスト 一覧画面のテスト book削除のテスト application.html.erbにjavascript_pack_tagを含んでいるか Failure/Error: expect(is_exist).to eq(1) expected: 1 got: 0 (compared using ==) ーー5つ目ーー 投稿のテスト 詳細画面のテスト リンクの遷移先の確認 Backの遷移先は一覧画 Failure/Error: expect(page).to have_current_path books_path expected "/books.1" to equal "/books" ーーーーーーー Failed examples: rspec ./spec/requests/books_spec.rb:5 # Books GET /update returns http success rspec ./spec/requests/books_spec.rb:12 # Books GET /destroy returns http success rspec ./spec/requests/homes_spec.rb:5 # Homes GET /top returns http success rspec ./spec/system/books_spec.rb:75 # 投稿のテスト 一覧画面のテスト book削除のテストapplication.html.erbにjavascript_pack_tagを含んでいるか rspec ./spec/system/books_spec.rb:119 # 投稿のテスト 詳細画面のテスト リンクの遷移先の確認 Backの遷移先は一覧画面か

該当のソースコード

books_controller.rb

1class BooksController < ApplicationController 2 def new 3 @book = Book.new 4 end 5 6 def create 7 @book = Book.new(book_params) 8 if @book.save 9 redirect_to book_path(@book.id), notice: 'Book was successfully created.' 10 else 11 @books = Book.all 12 render :index 13 end 14 end 15 16 def index 17 @books = Book.all 18 @book = Book.new 19 end 20 21 def show 22 @book = Book.find(params[:id]) 23 end 24 25 def edit 26 @book = Book.find(params[:id]) 27 end 28 29 def update 30 31 @book = Book.find(params[:id]) 32 if @book.update(book_params) 33 redirect_to book_path(@book.id), notice: 'Book was successfully updated.' 34 else 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, alert: 'Book was successfully destroyed.' 43 end 44 45 private 46 # ストロングパラメータ 47 def book_params 48 params.require(:book).permit(:title, :body) 49 end 50end

routes.rb

1Rails.application.routes.draw do 2 root :to => 'homes#top' 3 resources :books 4end

index

1<body> 2 <% if flash[:alert] %> 3 <p class="notice"><%= alert %></p> 4 <% end %> 5 6 <h1>Books</h1> 7 8 <table> 9 <thead> 10 <tr> 11 <th>Title</th> 12 <th>Body</th> 13 <th colspan="3"></th> 14 </tr> 15 </thead> 16 17 <tbody> 18 <% @books.each do |book| %> 19 <tr> 20 <td><%= book.title %></td> 21 <td><%= book.body %></td> 22 <td><%= link_to "Show", book_path(book.id) %></td> 23 <td><%= link_to "Edit", edit_book_path(book.id) %></td> 24 <td><%= link_to "Destroy", book_path(book.id), method: :delete, "data-confirm" => "本当に削除しますか?" %></td> 25 </tr> 26 <% end %> 27 </tbody> 28 </table> 29 30 <h2>New book</h2> 31 32 <% if @book.errors.any? %> 33 <div id="error_explanation"> 34 <h2><%= @book.errors.count %> error prohibited this book from being saved: 35 </h2> 36 <ul> 37 <% @book.errors.full_messages.each do |message| %> 38 <li><%= message %></li> 39 <% end %> 40 </ul> 41 </div> 42 <% end %> 43 44 <%= form_with model: @book do |f| %> 45 46 <div> 47 <label>Title</label> 48 <div class="field"><%= f.text_field :title %></div> 49 </div> 50 <div> 51 <label>Body</label> 52 <div class="field"><%= f.text_area :body %></div> 53 </div> 54 <div class="field"><%= f.submit 'Create Book' %></div> 55 56 <% end %> 57</body>

edit.html.erb

1<h1>Editing Book</h1> 2 3<% if @book.errors.any? %> 4 <div id="error_explanation"> 5 <h2><%= @book.errors.count %> error prohibited this book from being saved:</h2> 6 <ul> 7 <% @book.errors.full_messages.each do |message| %> 8 <li><%= message %></li> 9 <% end %> 10 </ul> 11 </div> 12<% end %> 13 14<%= form_with model: @book, local:true do |f| %> 15 16 <div> <!--<div class="field_error">--> 17 <label>Title</label> 18 <div class="field"><%= f.text_field :title %></div> 19 </div> 20 21 <div> <!--<div class="field_error">--> 22 <label>Body</label> 23 <div class="field"><%= f.text_area :body %></div> 24 </div> 25 26 <div class="field"><%= f.submit 'Update Book' %></div> 27 28 <div class="field"> 29 <span class="link_l"><%= link_to "Show", book_path(@book.id) %></span> 30 <span><%= link_to "Back", books_path %></span> 31 </div> 32 33<% end %>

show.html.erb

1<% if flash[:notice] %> 2 <p class="notice"><%= notice %></p> 3<% end %> 4 5<p><strong>Title:</strong> <%= @book.title %></p> 6<p><strong>Body:</strong> <%= @book.body %></p> 7 8<div class="field"> 9 <span class="link_l"><%= link_to "Edit", edit_book_path(@book.id) %></span> 10 <span><%= link_to "Back", books_path(@book.id) %></span> 11</div>

application.html.erb

1<!DOCTYPE html> 2<html> 3 <head> 4 <title>Bookers</title> 5 <%= csrf_meta_tags %> 6 7 <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 8 <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> 9 </head> 10 11 <body> 12 <%= yield %> 13 </body> 14</html>

試したこと

【エラー1.2】
各種記述、の確認、各挙動の確認
メンターの方に確認したところ、解決できず
【エラー3】
『routes.rb』で「get root :to => 'homes#top'」と記述しており、同様のエラーが発生していた。getを取り消し実行したが、変わらず現在に至る
【エラー4】
『application.html.erb』に「<%= javascript_pack_tag 'application' %>」と追加して見たところ別途エラーが複数発生。使い方を検索したところ、Webpackerのインストールを...とあったたが、わからないものだったため、現状は対応せず
【エラー5】
同じようなエラーの質問があったが特に記述に問題なくわからなかった。※参照

その他

最後までご確認ありがとうございます。
何がわからないかがわからなない状態が多く、エラーの理解や、検索のかけ方が甘かったりと、本投稿の内容が伝わりづらい点が多いこと申し訳ございません。何卒よろしくお願いいたします。

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

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

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

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

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

oimo_KENPI

2022/06/03 10:45

スペックが入らなかったのでこちらに追記いたします。 ```books_spec.rb require 'rails_helper' describe '投稿のテスト' do let!(:book) { create(:book,title:'hoge',body:'body') } describe 'トップ画面(root_path)のテスト' do before do visit root_path end context '表示の確認' do it 'トップ画面(root_path)に一覧ページへのリンクが表示されているか' do expect(page).to have_link "", href: books_path end it 'root_pathが"/"であるか' do expect(current_path).to eq('/') end end end describe "一覧画面のテスト" do before do visit books_path end context '一覧の表示とリンクの確認' do it "bookの一覧表示(tableタグ)と投稿フォームが同一画面に表示されているか" do expect(page).to have_selector 'table' expect(page).to have_field 'book[title]' expect(page).to have_field 'book[body]' end it "bookのタイトルと感想を表示し、詳細・編集・削除のリンクが表示されているか" do (1..5).each do |i| Book.create(title:'hoge'+i.to_s,body:'body'+i.to_s) end visit books_path Book.all.each_with_index do |book,i| j = i * 3 expect(page).to have_content book.title expect(page).to have_content book.body # Showリンク show_link = find_all('a')[j] expect(show_link.native.inner_text).to match(/show/i) expect(show_link[:href]).to eq book_path(book) # Editリンク show_link = find_all('a')[j+1] expect(show_link.native.inner_text).to match(/edit/i) expect(show_link[:href]).to eq edit_book_path(book) # Destroyリンク show_link = find_all('a')[j+2] expect(show_link.native.inner_text).to match(/destroy/i) expect(show_link[:href]).to eq book_path(book) end end it 'Create Bookボタンが表示される' do expect(page).to have_button 'Create Book' end end context '投稿処理に関するテスト' do it '投稿に成功しサクセスメッセージが表示されるか' do fill_in 'book[title]', with: Faker::Lorem.characters(number:5) fill_in 'book[body]', with: Faker::Lorem.characters(number:20) click_button 'Create Book' expect(page).to have_content 'successfully' end it '投稿に失敗する' do click_button 'Create Book' expect(page).to have_content 'error' expect(current_path).to eq('/books') end it '投稿後のリダイレクト先は正しいか' do fill_in 'book[title]', with: Faker::Lorem.characters(number:5) fill_in 'book[body]', with: Faker::Lorem.characters(number:20) click_button 'Create Book' expect(page).to have_current_path book_path(Book.last) end end context 'book削除のテスト' do it 'application.html.erbにjavascript_pack_tagを含んでいるか' do is_exist = 0 open("app/views/layouts/application.html.erb").each do |line| strip_line = line.chomp.gsub(" ", "") if strip_line.include?("<%=javascript_pack_tag'application','data-turbolinks-track':'reload'%>") is_exist = 1 break end end expect(is_exist).to eq(1) end it 'bookの削除' do before_delete_book = Book.count click_link 'Destroy' after_delete_book = Book.count expect(before_delete_book - after_delete_book).to eq(1) expect(current_path).to eq('/books') end end end describe '詳細画面のテスト' do before do visit book_path(book) end context '表示の確認' do it '本のタイトルと感想が画面に表示されていること' do expect(page).to have_content book.title expect(page).to have_content book.body end it 'Editリンクが表示される' do edit_link = find_all('a')[0] expect(edit_link.native.inner_text).to match(/edit/i) end it 'Backリンクが表示される' do back_link = find_all('a')[1] expect(back_link.native.inner_text).to match(/back/i) end end context 'リンクの遷移先の確認' do it 'Editの遷移先は編集画面か' do edit_link = find_all('a')[0] edit_link.click expect(current_path).to eq('/books/' + book.id.to_s + '/edit') end it 'Backの遷移先は一覧画面か' do back_link = find_all('a')[1] back_link.click expect(page).to have_current_path books_path end end end describe '編集画面のテスト' do before do visit edit_book_path(book) end context '表示の確認' do it '編集前のタイトルと感想がフォームに表示(セット)されている' do expect(page).to have_field 'book[title]', with: book.title expect(page).to have_field 'book[body]', with: book.body end it 'Update Bookボタンが表示される' do expect(page).to have_button 'Update Book' end it 'Showリンクが表示される' do show_link = find_all('a')[0] expect(show_link.native.inner_text).to match(/show/i) end it 'Backリンクが表示される' do back_link = find_all('a')[1] expect(back_link.native.inner_text).to match(/back/i) end end context 'リンクの遷移先の確認' do it 'Showの遷移先は詳細画面か' do show_link = find_all('a')[0] show_link.click expect(current_path).to eq('/books/' + book.id.to_s) end it 'Backの遷移先は一覧画面か' do back_link = find_all('a')[1] back_link.click expect(page).to have_current_path books_path end end context '更新処理に関するテスト' do it '更新に成功しサクセスメッセージが表示されるか' do fill_in 'book[title]', with: Faker::Lorem.characters(number:5) fill_in 'book[body]', with: Faker::Lorem.characters(number:20) click_button 'Update Book' expect(page).to have_content 'successfully' end it '更新に失敗しエラーメッセージが表示されるか' do fill_in 'book[title]', with: "" fill_in 'book[body]', with: "" click_button 'Update Book' expect(page).to have_content 'error' end it '更新後のリダイレクト先は正しいか' do fill_in 'book[title]', with: Faker::Lorem.characters(number:5) fill_in 'book[body]', with: Faker::Lorem.characters(number:20) click_button 'Update Book' expect(page).to have_current_path book_path(book) end end end end ```
guest

回答1

0

自己解決

本件の質問、解決いたしました。
以下に解決を載せます。

エラー1~3:スペックフォルダを一度削除し、再度入れなおすことで解決。
スペックフォルダをbookersに入れた際に、途中でエラーが発生し手織り、途中までできたスペックフォルダに再度スペックフォルダを入れ直しをしたため、それが原因か??
エラー4:環境構築がうまくできておらず、javascript_pack_tagが使用できるrailsのバージョンになっていなかった。
エラー5:link_toによるbackのリンク先を指定医する際に、books_path(@book.id)を記述しており、books_pathにidを取得させてしまっていた。

投稿2022/06/04 08:24

oimo_KENPI

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問