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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

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

Ruby on Rails

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

Q&A

解決済

3回答

3866閲覧

Ruby on Rails 削除ボタン 機能しない

shuto0901

総合スコア16

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/26 06:29

編集2020/08/26 08:18

前提・実現したいこと

投稿一覧の投稿を削除する。

【前提】
・テーマは本を読んだ感想を記録する簡単なアプリケーションの開発。
・その本についての感想を投稿・編集・削除できる機能の実装
・主に4つの画面を作成(アプリケーションTOP画面・投稿一覧画面・詳細画面・編集画面)
・投稿一覧と新規投稿フォームを1ページ内(index.html.erb)に置く。

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

削除ボタンを押すとエラーが発生する。

ActiveRecord::RecordNotFound in BooksController#show Couldn't find Book with 'id'=18
【コンソール画面】 Started DELETE "/books/16" for 126.35.198.145 at 2020-08-26 06:22:11 +0000 Cannot render console from 126.35.198.145! Allowed networks: 210.139.2.182, 127.0.0.0/127.255.255.255, ::1 Processing by BooksController#destroy as HTML Parameters: {"authenticity_token"=>"az2tWJ6HrNo9EmSQMIvaF2/Dcb78d9GrcBFVye5e4Tl9pu2mxzczzLKb/4dP9EGtcsK4N30m9OSXY4royx/RuA==", "id"=>"16"} Book Load (0.1ms) SELECT "books".* FROM "books" WHERE "books"."id" = ? LIMIT ? [["id", 16], ["LIMIT", 1]] ↳ app/controllers/books_controller.rb:33 (0.0ms) begin transaction ↳ app/controllers/books_controller.rb:34 Book Destroy (1.1ms) DELETE FROM "books" WHERE "books"."id" = ? [["id", 16]] ↳ app/controllers/books_controller.rb:34 (6.4ms) commit transaction ↳ app/controllers/books_controller.rb:34 Redirected to https://909daa84d1da445c878e416db4cbf3b0.vfs.cloud9.us-east-1.amazonaws.com/books/16 Completed 302 Found in 12ms (ActiveRecord: 7.7ms)

該当のソースコード

index.html.erb

1<h3>Books</h3> 2 3<table> 4 <thead> 5 <tr> 6 <th>title</th> 7 <th>body</th> 8 <th></th> 9 </tr> 10 </thead> 11 <tbody> 12 <% @books.each do |book| %> 13 <tr> 14 <td><%= book.title %></td> 15 <td><%= book.body %></td> 16 <td><%= link_to "Show", book_path(book) %></td> 17 <td><%= link_to "Edit", edit_book_path(book) %></td> 18 <td><%= link_to "Destroy", book_path(book), method: :delete, "data-confirm" => "Are you sure?" %></td> 19 </tr> 20 <% end %> 21 </tbody> 22</table> 23 24<h2>New book</h2> 25<%= form_with model: @book, url:'/books', local:true do |f| %> 26<h4>Title</h4> 27<%= f.text_field :title %> 28<h4>Body</h4> 29<%= f.text_area :body %> 30 31<%= f.submit 'Create Book' %> 32 33<% end %>
【books_controller.rb】 class BooksController < ApplicationController protect_from_forgery :except => [:destroy] def top end def index @books = Book.all @book = Book.new end def create @book = Book.new(book_params) @book.save redirect_to book_path(@book) end def show @book = Book.find(params[:id]) end def edit @book = Book.find(params[:id]) end def update @book = Book.find(params[:id]) @book.update(book_params) redirect_to book_path(@book) end def destroy @book = Book.find(params[:id]) @book.destroy redirect_to book_path end private def book_params params.require(:book).permit(:title, :body) end end
【routes.rb】 Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root 'books#top' resources :books end root GET / books#top books GET /books(.:format) books#index POST /books(.:format) books#create new_book GET /books/new(.:format) books#new edit_book GET /books/:id/edit(.:format) books#edit book GET /books/:id(.:format) books#show PATCH /books/:id(.:format) books#update PUT /books/:id(.:format) books#update DELETE /books/:id(.:format) books#destroy

試したこと

https://qiita.com/natu_kumo_/items/8ef3343fda6715ed1d1a
上記サイトを参考にapplication.jsにrails-ujsを追記。
→追記していない場合と同じエラー画面が表示される。

https://qiita.com/mami3sansan/items/6a9710b3ffdc937aa5f3
上記サイトを参考にコントローラーにprotect_from_forgeryを追記。
→追記していない場合と同じエラー画面が表示される。

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

ruby 2.6.3p62 rails 5.2.4.3
cloud9

deleteメソッドが機能しておらず、削除ボタンを押すとgetが反応し、showアクションが呼び出されるのでエラーになっていると仮定したのですが、削除ボタンを押してエラーが出た後、サーバーを立ち上げ直すと投稿がなぜか削除されています。

rails 初心者で非常に拙い質問ですが、どなたかご教授いただけたら幸いです。

イメージ説明

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

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

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

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

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

guest

回答3

0

削除のリンクを下記に変えてみてください(book_path(book)ではない)

<td><%= link_to "Destroy", book, method: :delete, "data-confirm" => "Are you sure?" %></td>

あと、コントローラは下記で良いと思います

class BooksController < ApplicationController before_action :set_book, only: [:show, :edit, :update, :destroy] # ← 追加 protect_from_forgery :except => [:destroy] def top end def index @books = Book.all @book = Book.new end def create @book = Book.new(book_params) @book.save redirect_to book_path(@book) end def show # @book = Book.find(params[:id]) ← 不要 end def edit # @book = Book.find(params[:id]) ← 不要 end def update # @book = Book.find(params[:id]) ← 不要 @book.update(book_params) redirect_to book_path(@book) end def destroy # @book = Book.find(params[:id]) ← 不要 @book.destroy redirect_to book_path end private def set_book @book = Book.find(params[:id]) # ここで事前処理として@bookを習得しておく end def book_params params.require(:book).permit(:title, :body) end end

投稿2020/08/26 08:04

yuichi555

総合スコア10

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

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

shuto0901

2020/08/26 08:20

ご回答いただきありがとうございます。 上記回答を参考に修正したところ、エラーが発生しました... エラー内容は質問フォームの補足情報にスクリーンショットを載せています。
guest

0

book_path(book)でbookを投げているので、そのまま@bookで受け取れるはずです。

def destroy #@book = Book.find(params[:id]) ←ここは削除 @book.destroy redirect_to book_path end

投稿2020/08/26 06:54

no1knows

総合スコア3365

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

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

shuto0901

2020/08/26 07:30

ご回答ありがとうございます。 no1knowsさんのおっしゃる通り現状の問題は解決しましたが、また新たなエラーが出ました... 上記サイトでコードの書き方を学び直そうと思います。 ご教授いただきありがとうございました。
guest

0

自己解決

destroyアクションのredirect先をbooks_pathに変更することで、解決しました。
投稿削除後ページ遷移せず、投稿一覧ページ(index.html.erb)に留まるのが前提でしたが、質問フォームにその前提を表記しておらず回答者様にはご迷惑をおかけしてしまったと思います。
二度とこのようなことが無いように、以後質問する際は表記漏れがないか、正しく状況が伝わるか確認して質問させていただきます。
回答してくださった方々ありがとうございました。

投稿2020/08/26 09:30

shuto0901

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問