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

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

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

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

Ruby on Rails 6

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

6482閲覧

link_toでdeleteメソッドが飛ばせない(Rails6+webpacker)

TakeshiAoyama

総合スコア4

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

Ruby on Rails 6

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/06/06 14:01

前提・実現したいこと

Railsで簡単なブログの作成をしております。
現在投稿した記事の削除機能の実装を試みております。

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

link_toヘルパーでdestroyアクションに飛ばそうとしているのですが、
なぜかhttpメソッドが「GET」と判定されてしまい、下記エラーが発生します。

Unknown action The action 'show' could not be found for ArticlesController

該当のソースコード

[index.html.erb] <% @articles.each do |article| %> <%= article.created_at.strftime('%Y/%m/%d') %> | <%= article.title %> <br> <%= article.content %><br> <% if user_signed_in? %> <%= link_to 'edit', edit_article_path(article) %> <%= link_to 'delete', article_path(article), method: :delete %> ★ここです★ <% end %>
[routes.rb] Rails.application.routes.draw do devise_for :users, controllers: { sessions: 'users/sessions'} devise_scope :user do get '/users/sign_out' => 'devise/sessions#destroy' end root 'articles#index' resources :users resources :articles end

コンソールでルーティングの確認

article GET /articles/:id(.:format) articles#show PATCH /articles/:id(.:format) articles#update PUT /articles/:id(.:format) articles#update DELETE /articles/:id(.:format) articles#destroy
[articles_controller.rb] class ArticlesController < ApplicationController before_action :user before_action :article, only:[:index, :edit, :update, :destroy] ※下記関係するアクションのみ記入 def index if @user @articles = @user.articles.order(created_at: :desc) end def destroy @article.destroy flash[:success] = "Article deleted" redirect_to root_url end private def article @article = Article.find_by(id: params[:id]) end def articles_params params.require(:article).permit(:title, :content) end

試したこと

なぜかlink_toではなく、button_toにすると記事が削除できます。
以上から削除に関するコードの記述方法に問題はないと考えております。

httpメソッドの「delete」はjavascriptを使用して送っているということまではなんとなく理解してます。layouts/application.html.erbファイルで、head部分に下記記入してます。

[layouts/application.html.erb] <head> <title>SampleBlog</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_pack_tag 'application', media: 'all' %> <%= javascript_pack_tag 'application' %> </head>

app/javascript/packs/application.js に下記記載

[app/javascript/packs/application.js] require("@rails/ujs").start() require("@rails/activestorage").start() require("channels") require("jquery") import 'bootstrap' import '../src/application.scss' import Rails from 'rails-ujs' Rails.start()
[package.json] { "name": "sample_blog", "private": true, "dependencies": { "@rails/actioncable": "^6.0.0", "@rails/activestorage": "^6.0.0", "@rails/ujs": "^6.0.3-1", "@rails/webpacker": "4.2.2", "jquery": "^3.5.1", "popper.js": "^1.16.1", "turbolinks": "^5.2.0" }, "version": "0.1.0", "devDependencies": { "webpack-dev-server": "^3.11.0" } }

開発環境

ruby 2.7.1
rails 6.0.3

何が問題でlink_toでdeleteメソッドが飛ばせないのか全くわからない状態です。
分かる方いらっしゃれば教えていただきたいです。。。

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

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

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

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

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

guest

回答1

0

【追記3】

TakeshiAoyamaさんも気づかれているようですが、jquery_ujs は@rails/ujs に置き換わっているようです。

jquery を積極的に利用していないのであれば、 app/javascript/packs/application.js から、

require("jquery")

を削除した方が良いかもしれません。

 参考までに Rails 6 でデフォルトで作られている当該箇所を記載します。

javascript

1require("@rails/ujs").start() 2require("turbolinks").start() 3require("@rails/activestorage").start() 4require("channels")

【追記2】

似たような記事を見つけました。

Railsの削除のルーティンがうまく行かない Unknown action The action 'show' could not be found for BlogsController - Qiita

app/assets/javascripts/application.js に

//= require jquery_ujs

を追記してみてください。

※Rails6 だとこの構成になっていないようなので別のファイルを修正する必要がありそうです。

【追記1】
Ruby on Rails チュートリアル:実例を使って Rails を学ぼうコラム 3.2. GETやその他のHTTPメソッドについてでは、以下のように書かれています。

これは、ブラウザがPATCHとDELETEをネイティブでは送信しないからです。しかし、Ruby on Railsなどの多くのWebフレームワークは、ブラウザがこれらの操作のリクエストを送信しているかのように見せかける技術 (偽装) を駆使して、PATCHとDELETEという操作を実現しています。

なのでブラウザーの開発者ツールで見ても GET でのアクセスに見えます。

問題の本質は、以下のエラーメッセージかと思います。

The action 'show' could not be found for ArticlesController

ちなみに

article GET /articles/:id(.:format) articles#show

に対応するメソッドは実装されていますか?

show メソッドが不要であれば、config/routes.rb でその旨を記載する必要があるかと思います。

resources :articles, :except => :show

参考:

【問題の本質とは関係ありません。】
Getting Started with Rails — Ruby on Rails Guides の例に倣って、

erb

1<%= link_to 'delete', article_path(article), method: :delete, 2 data: { confirm: 'Are you sure?' } %>

とした場合、どうなりますか?

【以下、勘違いです。】

erb

1<%= link_to 'destroy', article_path(article), method: :delete %>

では?

ruby

1def destroy 2 @article.destroy 3 flash[:success] = "Article deleted" 4 redirect_to root_url 5end

と宣言されているので。

routes も以下のように articles#destroy となっていますし。

DELETE /articles/:id(.:format) articles#destroy

投稿2020/06/06 14:24

編集2020/06/06 16:39
Yasumichi

総合スコア1773

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

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

TakeshiAoyama

2020/06/06 14:35

ご回答ありがとうございます。 link_to '○○’ (第一引数)の部分はリンクのテキストを表しているだけですので、ここを「destroy」に変えても見た目のリンクの文字列の表記が「delete」から「destroy」に変わるだけですね。。。
Yasumichi

2020/06/06 14:52

ああ、そうですね。お恥ずかしい。
Yasumichi

2020/06/06 15:07

とりあえず、本家の例を追記してみました。 ただし、この例でもブラウザー自体は、GET でアクセスしています。
TakeshiAoyama

2020/06/06 15:09

data: { confirm: 'Are you sure?' } 上記を入れてみてもエラーメッセージは変わりませんね。。。
Yasumichi

2020/06/06 15:14

さらに追記したのですが、おそらく GET になっていることは問題の本質ではないです。 The action 'show' could not be found for ArticlesController が問題の本質かと思います。
Yasumichi

2020/06/06 15:18

article GET /articles/:id(.:format) articles#show に対応するメソッドは実装されていますか?
TakeshiAoyama

2020/06/06 15:28

showは実装してません。 記事の詳細画面は今回のブログでは不要だからです。 仮にarticlesコントローラー内にshowを定義したとして、単にshowページに遷移するだけです。記事を削除するためのdestroyアクションに飛ばしたいという本来の目的とは逸れてしまいます。
Yasumichi

2020/06/06 15:40 編集

むしろ、不要であるなら不要である旨を routes.rb で記載する必要がありそうです。 使用するアクションへのルーティングだけを設定 - Ruby on Rails入門 https://www.javadrive.jp/rails/routing/index7.html resources :articles, :except => :show に変えたら、どうなるでしょうか?
TakeshiAoyama

2020/06/06 15:45

Routing Error No route matches [GET] "/articles/10" というエラーが出ます。。 記事で書かせていただいた通り、link_toをbutton_toに変えると記事はきちんと消せるのです。なので削除に関するコードは間違い無いと思うのですが。。
Yasumichi

2020/06/06 16:12

button_to と link_to が HTML レンダンリング後にどう表現されているか、違いを見てみると良いのではないでしょうか?
Yasumichi

2020/06/06 16:16

Railsの削除のルーティンがうまく行かない Unknown action The action 'show' could not be found for BlogsController - Qiita https://qiita.com/yoshinyan/items/194d3c4dcc0f246b1ad1 に似たような事例を見つけました。 app/assets/javascripts/application.js に //= require jquery_ujs // <- これを足す としたらどうなりますか?
Yasumichi

2020/06/06 16:24

ちょっと古い構成なので app/javascript/packs/application.js を修正する必要がありそうですね。
TakeshiAoyama

2020/06/06 16:30

いただいたリンクのページは私も見ております。application.jsの書き方がRails5とRails6で変わっているようで、Rails6では「jquery_ujs」は削れというような記述のウェブサイトもありました。 https://paulownia.hatenablog.com/entry/2020/01/01/202628 とりあえず頭が働くなってきたのでまた明日チャレンジしてみます。。 お付き合いいただきありがとうございました。。
Yasumichi

2020/06/06 16:32

色々、調べている内に jquery_ujs は、@rails/ujs に置き換わったようです。 jquery を積極的に使用していないのなら、 require("jquery") を削除した方が良いかもしれません。
TakeshiAoyama

2020/06/09 02:59

require("jquery")外したのですが、結果は変わりませんでした・・ @rails/ujs読み込み方についてもう少し勉強してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問