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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1451閲覧

ActionController::UrlGenerationError in Books#indexを解決し、indexのビューを表示させたい

Hedgehog9

総合スコア11

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/02 08:51

Ruby on Rails6.0.0で簡単な本の管理アプリを作っています。
category>bookのような構造になっていて、ルーティングはネストしてあります。
本の削除機能を実装しようとしたところ、indexのビューでエラーが発生しました。
具体的にはビューの

<div class="book-delete-button"> </div> このdiv間とコントローラーのdestoryアクションを追加しました。 pathは間違っていませんでした。

##エラー文

Showing /Users/xxxxxx/projects/book_management/app/views/books/_book.html.erb where line #13 raised: No route matches {:action=>"destroy", :category_id=>#<Book id: nil, content: nil, category_id: nil, user_id: nil, created_at: nil, updated_at: nil>, :controller=>"books"}, missing required keys: [:id], possible unmatched constraints: [:category_id] Extracted source (around line #13): 11 <%= image_tag book.image.variant(resize: '250x600'), class: 'book-image' if book.image.attached? %> 12 <div class="book-delete-button"> 13 <% link_to "この本を削除", category_book_path(@book), method: :delete %> 14 </div> 15 </div> 16 </div>

##ビュー

<div class="book-status"> <div class="upper-book"> <div class="book-date"> <%= l book.created_at %> </div> </div> <div class="lower-book"> <div class="book-content"> <%= book.content %> </div> <%= image_tag book.image.variant(resize: '250x600'), class: 'book-image' if book.image.attached? %> <div class="book-delete-button"> <% link_to "この本を削除", category_book_path(@book), method: :delete %> </div> </div> </div>

##books_controller

class BooksController < ApplicationController def index @categorys = Category.all @book = Book.new @category = Category.find(params[:category_id]) @books = @category.books.includes(:user) end def create @categorys = Category.all @category = Category.find(params[:category_id]) @book = @category.books.new(book_params) if @book.save redirect_to category_books_path(@category) else @books = @category.books.includes(:user) render :index end end def destroy @categorys = Category.all @category = Category.find(params[:category_id]) @book = @category.books.find(book_params) end private def book_params params.require(:book).permit(:content, :image).merge(user_id: current_user.id) end end

##rails routes

books_index GET /books/index(.:format) books#index root GET / categories#index edit_user GET /users/:id/edit(.:format) users#edit user PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update category_books GET /categories/:category_id/books(.:format) books#index POST /categories/:category_id/books(.:format) books#create category_book DELETE /categories/:category_id/books/:id(.:format) books#destroy categories POST /categories(.:format) categories#create new_category GET /categories/new(.:format) categories#new category DELETE /categories/:id(.:format) categories#destroy

##試したこと
@category, @categorys, @booksに値は入っていました。
ご回答お願いいたします。

##補足
モデルも関係ありましたら、添付します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

bookと@bookが混在していますが、ここはbookではないでしょうか?
@bookは = Book.new なので、未だIDが付与されていませんし、DBにsaveもされていないのですから、削除しようが無いです。

投稿2020/11/02 09:13

winterboum

総合スコア23347

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

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

Hedgehog9

2020/11/02 09:36

回答ありがとうございます。 初心者なもので、初歩的な内容ですみません。 ここはbookではないでしょうか?→とはどこのことを指してるのでしょうか? あと、<% link_to "この本を削除", category_book_path(@book), method: :delete %> この記述でpathを指定しているので、destroyアクションの@bookに飛ぶと思っていたのですが、違うのでしょうか?
winterboum

2020/11/02 10:19

% link_to "この本を削除", category_book_path(@book),  の @bookがbookでしょうという意味です。 destroyの@bookは@category.books.find(book_params)でえられます。 その book_paramsを作るのが category_book_path()ですがその@bookが違うということです。 その前に<%= book.content %>とか book.imageとかで表示している本を削除したいのですよね?
Hedgehog9

2020/11/02 10:30

そうです!!なるほど、解決しました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問