アプリケーションのテストの際
NoMethodError:undefined method `edit_book_path'のエラーが出ました。
コードを見直してみたところこのように書いているコードは見当たらず、どこがエラーなのかもわからない状況です。
books.contoroller.erb
class BooksController < ApplicationController def index @book = Book.new @books = Book.all end def show @book = Book.find(params[:id]) end def new # Viewへ渡すためのインスタンス変数に空のモデルオブジェクトを生成する。 end def edit @book = Book.find(params[:id]) @books = Book.all end def books end def create @books = Book.all @book = Book.new(list_params) if @book.save flash[:notice] = "Book was successfully destroyed." redirect_to book_path(@book.id) else @books = Book.all render 'index' end end def update @books = Book.all @book = Book.find(params[:id]) if @book.update(list_params) redirect_to book_path(@book.id) else render 'edit' end end def destroy book = Book.find(params[:id]) book.destroy redirect_to books_path end private def list_params params.require(:book).permit(:title, :body) end end
edit.html.rb
<div id="edit-title"> <div class="edit-logo"> <h1>Editing Book</h1> </div> <%= form_with model:@book,local:true,class: "main-item" do |f| %> <% if @book.errors.any? %> <h2 class="main-error"><%= @book.errors.count %>個のerrorsがあります<br></h2> <% @book.errors.full_messages.each do |msg| %> <li class="main-error2"><%= msg %><br/></li> <% end %> <% end %> <div class="edit-logo"> <%= form_with model:@book, url:"/books/#{@book.id}", local:true do |f| %> <div class="edit-title"> <p>Title</p> <%= f.text_field :title %> </div> <div class="edit-body"> <p>Body</p> <%= f.text_area :body %> </div> <%= f.submit '保存' %> <% end %> <% end %> </div> </div>
index.html.rb
<main> <!-- form_with部分 --> <% if flash[:notice] %> <div class="flash"> <%= flash[:notice] %> </div> <% end %> <div id="main-title"> <h1>Books</h1> </div> <table> <thead> <tr class="tr-title"> <th>Title</th> <th>body</th> <th></th> </tr> <thead> <% @books.each do |book| %> <tbody> <tr class="tr-tilte2"> <td class="td-tilte"><span><%= book.title %></span></td> <td class="td-title"><span><%= book.body %></span></td> <td><%= link_to 'Show', book_path(book) %></td> <td><%= link_to 'Edit', edit_books_path(book.id) %></td> <td><%= link_to "delete", book_path(book), method: :delete, data:{confirm:'Are you sure?'}%></td> </tr> </tbody> <% end %> </table> <div class="main-logo"> <h1>New book</h1> </div> <%= form_with model:@book,local:true,class: "main-item" do |f| %> <% if @book.errors.any? %> <h2 class="main-error"><%= @book.errors.count %>個のerrorsがあります<br></h2> <% @book.errors.full_messages.each do |msg| %> <li class="main-error2"><%= msg %><br/></li> <% end %> <% end %> <div class="main-list"> <h4>title</h4> <%= f.text_field :title %> </div> <div class="main-list2"> <h4>body</h4> <%= f.text_area :body %> <%= f.submit '投稿' %> <% end %> </div> </main>
show.html.rb
<div id="show-title"> <p>Book was successfully created.</p> <p><%= @book.title %></p> <p><%= @book.body %></p> <div class="show-list"> <%= link_to "edit", edit_books_path(@book.id) %> <%= link_to 'back','/books' %> </div> </div>
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 'bookの削除' do expect{ book.destroy }.to change{ Book.count }.by(-1) # ※本来はダイアログのテストまで行うがココではデータが削除されることだけをテスト 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
試したこと
・コードの再確認
問題のコードが見当たらず、困っています。
回答よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー