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

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

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

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

Ruby on Rails 6

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Q&A

解決済

1回答

682閲覧

「rails」Rspecで表示されたエラー内容について

kota_6211

総合スコア1

Ruby on Rails 5

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

Ruby on Rails 6

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

0グッド

0クリップ

投稿2023/03/31 02:42

前提

「rails」Rspec で表示されたエラーが出てきてしまいました。
6割くらいは自力でできたのですが残りが色々と調べて試してもうまくいかず、行き詰まってしまいました。
どなたか助言をいただけると助かります!よろしくお願いします!

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

1) 投稿のテスト 一覧画面のテスト 一覧の表示とリンクの確認 bookのタイトルと感想を表示し、詳細・編集・削除のリンクが表示されているか Failure/Error: expect(show_link[:href]).to eq book_path(book) expected: "/books.1" got: "/books/1" (compared using ==) # ./spec/system/books_spec.rb:40:in `block (5 levels) in <main>' # ./spec/system/books_spec.rb:33:in `each_with_index' # ./spec/system/books_spec.rb:33:in `block (4 levels) in <main>' 2) 投稿のテスト 一覧画面のテスト 投稿処理に関するテスト 投稿後のリダイレクト先は正しいか Failure/Error: expect(page).to have_current_path book_path(Book.last) expected "/books/2" to equal "/books.2" # ./spec/system/books_spec.rb:71:in `block (4 levels) in <main>' 3) 投稿のテスト 詳細画面のテスト 表示の確認 Editリンクが表示される Failure/Error: expect(edit_link.native.inner_text).to match(/edit/i) expected "Show" to match /edit/i Diff: @@ -1 +1 @@ -/edit/i +"Show" # ./spec/system/books_spec.rb:106:in `block (4 levels) in <main>' 4) 投稿のテスト 詳細画面のテスト 表示の確認 Backリンクが表示される Failure/Error: expect(back_link.native.inner_text).to match(/back/i) expected "Edit" to match /back/i Diff: @@ -1 +1 @@ -/back/i +"Edit" # ./spec/system/books_spec.rb:110:in `block (4 levels) in <main>' 5) 投稿のテスト 詳細画面のテスト リンクの遷移先の確認 Editの遷移先は編集画面か Failure/Error: expect(current_path).to eq('/books/' + book.id.to_s + '/edit') expected: "/books/1/edit" got: "/books/1" (compared using ==) # ./spec/system/books_spec.rb:117:in `block (4 levels) in <main>'

該当のソースコード

routes

1Rails.application.routes.draw do 2 3 root 'homes#top' 4 get 'books' => 'books#index',as: 'book' 5 post 'books' => 'books#create' 6 delete 'books/:id' => 'books#destroy',as: 'destroy_book' 7 get 'books/:id' => 'books#show',as: 'show_book' 8 get 'books/:id/edit' => 'books#edit',as: 'edit_book' 9 patch 'books/:id' => 'books#update' ,as: 'update_book' 10end 11

controlle

1class BooksController < ApplicationController 2 def index 3 @books = Book.all 4 @book = Book.new 5 end 6 def create 7 @book = Book.new(book_params) 8 if @book.save 9 flash[:notice] = "Book was successfully created." 10 redirect_to show_book_path(@book) 11 else 12 @books = Book.all 13 render 'index' 14 end 15 end 16 def destroy 17 @book = Book.find(params[:id]) 18 @book.destroy 19 flash[:notice] = "Book was successfully destroyed." 20 redirect_to book_path 21 end 22 23 def show 24 @book = Book.find_by(id: params[:id]) 25 end 26 27 def edit 28 @book = Book.find(params[:id]) 29 end 30 def update 31 @book = Book.find(params[:id]) 32 if @book.update(book_params) 33 flash[:notice] = "Book was successfully updated." 34 redirect_to show_book_path(@book) 35 else 36 render 'edit' 37 end 38 end 39 40 41 private 42 def book_params 43 params.require(:book).permit(:title ,:body) 44 end 45end

index_html

1<body> 2 3<div class="show-flash"> 4 <%= flash[:notice] %> 5</div> 6<div class="index-header">Books</div> 7 8 9 10 <table class="index"> 11 <tr> 12 <th class="index-title-text1">Title</th> 13 <th class="index-title-text2">Body</th> 14 </tr> 15 16 17 <% @books.each do |book| %> 18 <tr class="index-link" > 19 <td class="index-title"><%= book.title %></td> 20 <td class="index-title"><%= book.body %></td> 21 <td class="index-title"><%= link_to("Show",show_book_path(book)) %></td> 22 <td class="index-title"><%= link_to("Edit",edit_book_path(book)) %></td> 23 <td class="index-title"><%= link_to("Destroy", destroy_book_path(book.id),method: :delete,"data-confirm" =>"are you sure?",class: "delete-button") %></td> 24 </tr> 25 <% end %> 26 </table> 27 28 <% if @book.errors.any? %> 29 <div class="errors"> 30 <h2 class="index-errors"><%= @book.errors.count %>errors prohibited this book from being saved:</h2> 31 <ul class="errors-text"> 32 <% @book.errors.full_messages.each do |message| %> 33 <li class="index-errors-massage"><%= message %></li> 34 <% end %> 35 </ul> 36 </div> 37 <% end %> 38 39<div class="new-books"> 40 <h2 class="new-books-title">New book</h2> 41 <%= form_with model: @book, url: books_path , local: true do |f| %> 42 <p class="new-books-text">Title</p> 43 <%= f.text_field :title ,class:"text-field"%> 44 45 <div class="new-body"> 46 <p class="new-books-text">Body</p> 47 <%= f.text_area :body ,class:"text-area"%> 48 </div> 49 50 <%= f.submit 'Create Book', class: "buttom"%> 51 <% end %> 52 </div> 53 54</body> 55

show_html

1body> 2 <div class="show-flash"> 3 <%= flash[:notice] %> 4 </div> 5 <div class="show"> 6 <div class="show-text"><p>Title:</p><%= @book.title %></div> 7 <div class="show-text"><p>Body:</p><%= @book.body %></div> 8 </div> 9 10 <div class="show-link"> 11 <%= link_to"Edit", edit_book_path(@book) %> 12 <span>|</span> 13 <%= link_to"Back",book_path %> 14 </div> 15 16 17</body>

edit_html

1<body> 2 <h1 class="edit-header">Editing Book</h1> 3 4 5 <% if @book.errors.any? %> 6 <%= @book.errors.count %>errors prohibited this book from being saved: 7 <ul> 8 <% @book.errors.full_messages.each do |message| %> 9 <li><%= message %></li> 10 <% end %> 11 </ul> 12 <% end %> 13 14 <div class="edit"> 15 <%= form_with model: @book ,url: edit_book_path(@book) , url: update_book_path(@book.id), method: :patch do |f| %> 16 17 <div class="edit-text"><p>Title</p><%= f.text_field :title ,class:"text-field"%></div> 18 19 <div class="edit-text"><P>Body</P><%= f.text_area :body ,class:"text-area"%></div> 20 21 <div class=""><%= f.submit 'Update Book' , class: "buttom"%></div> 22 23 <% end %> 24 25 </div> 26 27 <div class="show-link"> 28 <%= link_to("Show",show_book_path(@book)) %><span>|</span><%= link_to("Back",book_path) %> 29 </div> 30 31 32 33</body> 34

試したこと

controllerとroutes内で色々いじって試してみたのですがうまく行きませんでした。

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

Rails 6.1.7.2
ruby 3.1.2p20

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

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

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

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

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

guest

回答1

0

ベストアンサー

routes.rb に自分で独自のrouteを設定していますが、そこの定義とrspecで使っている *_path が矛盾しているからです。
routes.rbによれば book_path は indexを呼ぶもので引数は不要です。そこに book を渡しているのが原因です。
routes.rb によれば 'books/:id' は show_book_path(book) ですね。

しかし
独自のpathを定義するのはなにか意図が有りますか?
でないならrails が用意している標準のものを使うのが良いです。あなたのcodeを読む人に余分な負担を掛けることになってしまいますから。 book関係のroute定義は全部削除して、代わりに resources :books としてください。
それでどういうpathが用意されるか、は rails routes で確かめて。

投稿2023/03/31 15:06

winterboum

総合スコア23522

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問