17
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

Railsでlink_to deleteメソッドが動かない

rails5.2を使ってアプリを実装中にハマったエラーです。
なかなか解決策が見つからず困ったのでメモとして置いておきます。

状況

rootテーブルに投稿されたレコードを削除するため、実装したが削除されない。
リンクは表示されてクリックできるけどアクションが発火しない。加えてエラーも出ない。
ログを見るとGETで送られている。

<%= link_to '削除', "#{@root.id}", method: :delete %>

基本的な確認はしてみた。
route.rb、controllerの記述はちゃんとできてる。
rails routesを確認して、HTTPメソッドは来ている。htmlもdeleteになっている。

route.rb
  resources :roots

roots_controller.rb
  def destroy
    root= Root.find(params[:id])
    root.destroy
    redirect_to root_path
  end

試したこと

application.js
//= require rails-ujs
があるか確認。→ 記述はあったのでパス。

Turbolinksのバージョンを見る
→ Githubの投稿を読んで参考にしてみた。
https://gist.github.com/JunichiIto/791ee8b6c9eb4ac639d2141465f89fc4

・・・どうもうまくいかない。

解決方法

あれこれ修正を繰り返していたら「ActionController::InvalidAuthenticityToken」というエラーに当たる。
これがきっかけ。

■原因
RailsのCSRF対策が堅固なので外部からのアクセスをはじく設定がデフォルトになっていたため。
外部サイトからのAPIリクエストと認識されたようで、受け付けないらしい。
 ※RailsのCSRF対策についてはここでは割愛します。

■実装1
destroyアクションを実施したいコントローラーに追記する。
protect_from_forgery の記述を使います。(詳細は調べてください)

今回はRootsコントローラーからdestoryアクションを除外

1 class RootsController < ApplicationController
2  protect_from_forgery :except => [:destroy]
3
4  def index
///////以下省略////////

■実装2
link_toをbutton_toに修正。(なぜかlink_toだと動かなかった)

<%= link_to '削除', "#{@root.id}", method: :delete %>
 ↓
<%= button_to '削除', "#{@root.id}", method: :delete %>

■結果
無事削除とredirect_toが動きました。

最後に

今回はこの実装で投稿削除ができました。RailsのCSRF対策で見えにくいデフォルトの挙動などもあるので公式ガイドなどをチェックをされると良いと思います。
destroyアクションが効かない、deleteメソッドも来ている、コードもあっている、ときのエラーで本当に焦りましたが、エラーが解決の糸口でした。参考になれば幸いです。

参考

https://qiita.com/chobi9999/items/2b59fdaf3dd8f2ed9268
http://takayuki-inoue.hatenablog.com/entry/2018/01/12/105846
https://qiita.com/ayacai115/items/ec7a621ec73692065d7a
https://qiita.com/natu_kumo_/items/8ef3343fda6715ed1d1a

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
17
Help us understand the problem. What are the problem?