kota-6211
@kota-6211

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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

解決したいこと

「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>'

該当するソースコード

Rails.application.routes.draw do

  root 'homes#top'
  get 'books' => 'books#index',as: 'book'
  post 'books' => 'books#create'
  delete 'books/:id' => 'books#destroy',as: 'destroy_book'
  get 'books/:id' => 'books#show',as: 'show_book'
  get 'books/:id/edit' => 'books#edit',as: 'edit_book'
  patch 'books/:id' => 'books#update' ,as: 'update_book'
end
class BooksController < ApplicationController
  def index
    @books = Book.all
    @book = Book.new
  end
  def create
    @book = Book.new(book_params)
    if @book.save
      flash[:notice] = "Book was successfully created."
     redirect_to show_book_path(@book)
    else
     @books = Book.all
    render 'index'
    end
  end
  def destroy
    @book = Book.find(params[:id])
    @book.destroy
    flash[:notice] = "Book was successfully destroyed."
    redirect_to book_path
  end

  def show
    @book = Book.find_by(id: params[:id])
  end

  def edit
    @book = Book.find(params[:id])
  end
  def update
    @book = Book.find(params[:id])
    if @book.update(book_params)
     flash[:notice] = "Book was successfully updated."
     redirect_to show_book_path(@book)
    else
     render 'edit'
    end
  end


  private
  def book_params
    params.require(:book).permit(:title ,:body)
  end
end
<body>

<div class="show-flash">
    <%= flash[:notice] %>
</div>
<div class="index-header">Books</div>



    <table class="index">
      <tr>
        <th class="index-title-text1">Title</th>
        <th class="index-title-text2">Body</th>
      </tr>


        <% @books.each do |book| %>
         <tr class="index-link" >
          <td class="index-title"><%= book.title %></td>
          <td class="index-title"><%= book.body %></td>
          <td class="index-title"><%= link_to("Show",show_book_path(book)) %></td>
          <td class="index-title"><%= link_to("Edit",edit_book_path(book)) %></td>
          <td class="index-title"><%= link_to("Destroy", destroy_book_path(book.id),method: :delete,"data-confirm" =>"are you sure?",class: "delete-button") %></td>
         </tr>
        <% end %>
    </table>

 <% if @book.errors.any? %>
  <div class="errors">
      <h2 class="index-errors"><%= @book.errors.count %>errors prohibited this book from being saved:</h2>
     <ul class="errors-text">
       <% @book.errors.full_messages.each do |message| %>
         <li class="index-errors-massage"><%= message %></li>
       <% end %>
     </ul>
  </div>
 <% end %>

<div class="new-books">
    <h2 class="new-books-title">New book</h2>
    <%= form_with model: @book, url: books_path , local: true do |f| %>
     <p class="new-books-text">Title</p>
      <%= f.text_field :title ,class:"text-field"%>

      <div class="new-body">
        <p class="new-books-text">Body</p>
        <%= f.text_area :body ,class:"text-area"%>
      </div>

     <%= f.submit 'Create Book', class: "buttom"%>
     <% end %>
  </div>

</body>
<body>
  <div class="show-flash">
    <%= flash[:notice] %>
  </div>
  <div class="show">
    <div class="show-text"><p>Title:</p><%= @book.title %></div>
    <div class="show-text"><p>Body:</p><%= @book.body %></div>
  </div>

  <div class="show-link">
    <%= link_to"Edit", edit_book_path(@book) %>
    <span>|</span>
    <%= link_to"Back",book_path %>
  </div>


</body>
<body>
  <h1 class="edit-header">Editing Book</h1>


 <% if @book.errors.any? %>
   <%= @book.errors.count %>errors prohibited this book from being saved:
  <ul>
    <% @book.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
  </ul>
 <% end %>

 <div class="edit">
   <%= form_with model: @book ,url: edit_book_path(@book) , url: update_book_path(@book.id), method: :patch do |f| %>

   <div class="edit-text"><p>Title</p><%= f.text_field :title ,class:"text-field"%></div>

   <div class="edit-text"><P>Body</P><%= f.text_area :body ,class:"text-area"%></div>

   <div class=""><%= f.submit 'Update Book' , class: "buttom"%></div>

   <% end %>

  </div>

  <div class="show-link">
    <%= link_to("Show",show_book_path(@book)) %><span>|</span><%= link_to("Back",book_path) %>
  </div>



</body>

自分で試したこと

controllerとroutesに問題があると思い、色々いじって試したのですがうまくいかず完全に行き詰まってしまいました。

0

1Answer

いくつかの Spec 失敗理由を見ると以下のように

      expected: "/books.1"
            got: "/books/1"

       expected: "/books/1/edit"
            got: "/books/1"

特に「/books.1 これは スラッシュであるべきところが.(ドット)が表示されていることから、routes の問題です。

記載された routes は以下のようですが、

Rails.application.routes.draw do

  root 'homes#top'
  get 'books' => 'books#index',as: 'book'
  post 'books' => 'books#create'
  delete 'books/:id' => 'books#destroy',as: 'destroy_book'
  get 'books/:id' => 'books#show',as: 'show_book'
  get 'books/:id/edit' => 'books#edit',as: 'edit_book'
  patch 'books/:id' => 'books#update' ,as: 'update_book'
end

コメントを記載するならば

Rails.application.routes.draw do

  root 'homes#top'
 # 一覧
  get 'books' => 'books#index',as: 'book'

 # 登録
  post 'books' => 'books#create'

 # 削除
  delete 'books/:id' => 'books#destroy',as: 'destroy_book'

 # 詳細画面
  get 'books/:id' => 'books#show',as: 'show_book'

 # 編集画面
  get 'books/:id/edit' => 'books#edit',as: 'edit_book'

 # 更新
  patch 'books/:id' => 'books#update' ,as: 'update_book'
end

上記の基本パターンというのは以下のような一行に圧縮できます

resources :books

でカバーできるはずです。 その上で、再度 Spec を一度お試しください。

0Like

Comments

  1. @kota-6211

    Questioner

    有難うございます!
    一つ質問があり、routesのpathを全部単数形のbookで使ってしまっていて、
    resources :books にするとエラーのなってしまい resources :book にしてもエラーになってしまいます。
    この場合どこからやり直した方がいいのでしょうか?
  2. > 一つ質問があり、routesのpathを全部単数形のbookで使ってしまっていて、
    単数系のbookというのは 既存の一行一行 routes に書いているパターンの事を指しておりますでしょうか?
    その場合は、その一行一行のを全て削除してから、resources のみにする。必要があります。
  3. @kota-6211

    Questioner

    resources について調べ1から全部作り直したところ1発で全てパスすることが出来ました!
    ありがとうございました!!!
  4. ご報告ありがとうございます!
    良かったです。ベストアンサー機能みたいなのはないんですね、これ笑笑

Your answer might help someone💌