タイトル通り、勉強のために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メソッドも機能していることが確認できた。おしまい。
以下感想というか駄文
まずは落ち着いて横着せずにエラー文をちゃんとよく読もうね!!!(結論)
エラー文を検索エンジンに突っ込んで調べるのは実際有効だけどそこで見つかった情報が正しいかどうかはよく確認した上でやろうね!バージョンが違ったり情報が古いとかは実際よくあるし。
今回ちゃんとエラーメッセージを確認して必要なパッケージを入れたら2つで済んだし、前回は初回対応時に手当たり次第にnpl installしたりrails webpacker:installしたりあとpackage.jsonとかGemfileとかいろいろいじったりしたらエラーメッセージが変わっただけに終わって面倒くさくなったのは反省点。というか解決するの諦めてもう1回rails newして最初から作り直して以前の環境から必要なコードを全部コピペ移植した上で改めて対応したのも解決までに苦労した原因だったりする。あと実はこのスケジュール管理アプリもアプリ名とモデル名を同じ名前でgenerateしようとするとエラーになるの知らなくてしぶしぶ作業してたけどわかりにくいし結局もう1回rails newで作り直したものだったりする。
というわけでここまで自分のケースでやったことを書いてみたけどこれが他の人の役に立つかは知らないけど参考になれば嬉しいです。今度こそおしまい。