👻

Link_toとmethod: :deleteでエラーが出る話

2023/12/29に公開

生じた問題
・link_toでdestroy actionを呼び出そうとしてmethod: :deleteを指定すると、methodがgetをとってしまって、routing errorが生じた。

解決法
・turbo_methodを用いる。具体的には
link_to url,data:{turbo_method: :delete}
でmethodを指定する。
・エラー防止のため、コントローラにおいてstatus: :see_otherを追加する。具体的には
redirect_to url, status: :see_other
とする。

原因
・そもそもHTMLではgetとpostにしか対応していない(らしい)
→patchやdeleteにはJSを利用しながらrouteを指定している
・そこで、従来ではrails-ujs、rails7以降ではhotwireのturboを呼び出しながらpatchやdeleteを活用
・turbo_methodを代替することでturboを利用してdeleteを呼び出すことが可能に

補足
・status: :see_otherを指定しない場合、redirect先のpathにdeleteで遷移することがあるそう、、、(未確認)

疑問点(←詳しい方いたら初学者にわかるよう教えてください。)
①deleteやpatchのmethod指定に失敗するのは、調べたところlink_toばかりであるよう
→なぜに、form_withやbutton_toでは指定できるのか?
(実際に手元にあるコードを"method: :delete"などで全検索すると、ちゃんと動作しているform_withやbutton_toを確認)
②turbo_methodってどんな動きしてるですか...?status: :see_otherは強制的にgetを取るようにするらしいのですが、なぜこれが必要になるか、turbo_methodのどんな働きのせいでそうなるのか、がよくわからないです。

Discussion