Rails6でlink_to method: :deleteメソッドが効かなかった話とその解決までにやったこと

タイトル通り、勉強のためにRails6でスケジュール管理アプリを作成してCRUD処理を実装している時にlink_to method: :deleteが効かずDELETEではなくGETでリクエストが送られてしまう問題が発生したので対処したことを備忘録的にまとめてみる。とは言っても基本的には同じような問題に当たった先人たちが書き残したものを参考にしてるだけなので真新しい情報はないと思う。というかぶっちゃけ前にも同じことがあってその時も初学者ゆえ解決までに苦労したので自分用のメモとして残しておきたい気持ちの方が大きい。

ちなみに使用してるRailsのバージョンは6.1.3.2……と思ったがrails newした時に6.1.3.2とバージョン指定したのにGemfileを修正するの忘れてたらしくてrails -vしたら6.1.7.7とか表示されてた。(本題とは関係ないけどこのあとGemfile修正してrails webpacker:installしてrails -vしたら6.1.3.2になったし多分修正できたと思う)

 

結論(3/31追記)

この前置きを見てもわかるように話が長くなってしまうのが自分の悪い癖だと自覚しているので最初に結論を置いておきますと@babel/plugin-proposal-private-methodsと@babel/plugin-proposal-private-property-in-objectをyarn addしてあげたら解決できました。

 

やったこと

前提としてまずdeleteではなくgetになってしまっているのがビューファイルの

<%= link_to "削除", schedule, method: :delete, data: { confirm: "本当に削除しますか?" } %>

というリンク部分でコントローラーには

  def destroy
    @schedule = Schedule.find(params[:id])
    @schedule.destroy
    flash[:notice] = "予定を削除しました"
    redirect_to :schedules
  end

というように記述している。コントローラー名はschedules、モデル名はscheduleである。(コード引用部分はひとまず黒背景白文字にしてあるけどあとで文字色いじって見やすくするかも)

 

ここでChromeの検証ツールを開くとコンソールに以下のようなエラーが表示されている。

Uncaught Error: Module build failed (from ./node_modules/babel-loader/lib/index.js): Error: Cannot find package '@babel/plugin-proposal-private-methods' imported from (ユーザー名などを含むファイルパスなので削除)/scheduleapp/babel-virtual-resolve-base.js

このエラーは要約すると@babel/plugin-proposal-private-methodsというパッケージが見つからないよというエラーなのでターミナルで

yarn add @babel/plugin-proposal-private-methods

と実行してパッケージを入れてみる。するとエラーメッセージが以下のように変わった。

Uncaught Error: Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: [BABEL]: --- PLACEHOLDER PACKAGE ---
This @babel/plugin-proposal-private-property-in-object version is not meant to
be imported. Something is importing
@babel/plugin-proposal-private-property-in-object without declaring it in its
dependencies (or devDependencies) in the package.json file.
Add "@babel/plugin-proposal-private-property-in-object" to your devDependencies
to work around this error. This will make this message go away.

ここでpackage.jsonを確認すると@babel/plugin-proposal-private-property-in-objectが見当たらなかったのでこれも同じくインストールする。

yarn add @babel/plugin-proposal-private-property-in-object

この段階で検証ツールを確認するとエラーが消えており以下の通り:deleteメソッドも機能していることが確認できた。おしまい。

deleteメソッドが動作したことでconfirmで設定した確認メッセージが表示されている

 

以下感想というか駄文

まずは落ち着いて横着せずにエラー文をちゃんとよく読もうね!!!(結論)

エラー文を検索エンジンに突っ込んで調べるのは実際有効だけどそこで見つかった情報が正しいかどうかはよく確認した上でやろうね!バージョンが違ったり情報が古いとかは実際よくあるし。
今回ちゃんとエラーメッセージを確認して必要なパッケージを入れたら2つで済んだし、前回は初回対応時に手当たり次第にnpl installしたりrails webpacker:installしたりあとpackage.jsonとかGemfileとかいろいろいじったりしたらエラーメッセージが変わっただけに終わって面倒くさくなったのは反省点。というか解決するの諦めてもう1回rails newして最初から作り直して以前の環境から必要なコードを全部コピペ移植した上で改めて対応したのも解決までに苦労した原因だったりする。あと実はこのスケジュール管理アプリもアプリ名とモデル名を同じ名前でgenerateしようとするとエラーになるの知らなくてしぶしぶ作業してたけどわかりにくいし結局もう1回rails newで作り直したものだったりする。

 

というわけでここまで自分のケースでやったことを書いてみたけどこれが他の人の役に立つかは知らないけど参考になれば嬉しいです。今度こそおしまい。

はじめましてのはてなブログ開設理由

初めまして、コイズミケイと名乗ることにしたものです。当たり前だけど本名じゃないよ。

 

はてなブログ最初の記事で何を書こうか考えてみたけどタイトル通りのことを備忘録的に書くのがいい気がしたので書いてみる。
開設理由と言っても至極単純で諸事情により自分が今勉強してることの学習記録、端的に言えばナレッジというやつをどこかに書いて残せる場所が欲しくなったからである。勉強してる内容がプログラミングだとかそういう内容なのもあり、他の候補としてnoteやらQiitaあたりでやるのも考えたけどnoteは過去に利用者のIPアドレスが晒されるバグがあったこと、Qiitaは運営がちょくちょくやらかして炎上したり直近(って言ってももう3〜4年くらい前)では勝手にユーザーの読んでる記事の傾向を他のユーザーにもわかる形で晒して退会祭りになったのも記憶に新しく、noteとQiitaとはてなブログならはてなブログに記録を残すのがいいかなぁとぼんやりと思ったのが開設理由になります。

そんなわけで今後は不定期で学んだことを備忘録的に書いて運用していこうと思います。プライベートなこととかは多分書かないと思う。