こんにちは、miyoshiです。
モニター開発も順調に進んでおります。
今回は、ISSUE3 のところで、実装できた部分をご紹介します。
合わせて、失敗と改善策も含めて、ご紹介します。
この記事も、前回公開した記事の続編です。
- 「モニター開発」で進めたら、いい感じの話
- 【Rails × Devise】初心者エンジニアがユーザー認証を実装してみた話
- Rails × Devise × Basic認証】管理画面のセキュリティと使いやすさを両立した話
今回実装したこと(ISSUE#3)
管理者用時間枠の管理機能追加
- 時間枠モデル(例:TimeSlot)を作成
- 時間枠管理用のCRUD画面を作成(管理者専用)
- バリデーションや重複チェックを実装
- 管理者以外はアクセス不可に設定
僕の体験談:削除ボタンを実装したのに動かない?!
管理画面で時間枠を管理する機能を作っていた時、「削除」を押しても削除されず、代わりに、、、
「The action 'show' could not be found」
エラーが、、、😱
最初はコントローラーやルーティングに問題があると思い、何度もコードを見直しました。
なぜリンクで削除リクエストが送れないの?
実はHTMLの<a>タグはGETリクエストしか送れません。
だから、普通にlink_toで削除用リンクを作っても、ブラウザはGETを送ってしまい、Railsはshowアクションを呼び出そうとしてしまうんです。
ここに僕はハマりました…
「なんで削除なのにshowアクションが呼ばれるんだ!?」と一瞬パニックに。😅
RailsはJavaScriptで書き換えている
RailsではJavaScriptを使い、リンククリック時にリクエストのHTTPメソッドをDELETEに変えてくれます。
でもこのJavaScriptが正しく読み込まれていないと、ただのGETリンクになってしまいます。
僕の解決策
app/views/layouts/application.html.erbでJavaScript読み込みタグの修正
<%= javascript_importmap_tags %>
削除リンクの正しい書き方(僕の最終コード)
<%= link_to "削除", admin_slot_path(slot), data: { turbo_method: :delete }
data: { turbo_method: :delete }をつけることで、JavaScriptがDELETEリクエストに変換してくれます。
まとめ:削除ボタンが動かないときのチェックリスト
-
HTMLのリンクはGETしか送れないことを知る
-
RailsのJavaScript(importmap)が正しく読み込まれているか確認
-
application.html.erbに <%= javascript_importmap_tags %> があるか見る
-
link_toのdata-{turbo-method: :delete}が正しく書かれているか確認
最後に
実際の開発では「原因はここ?」と思ったところが違ったり、ハマることが多いですよね。
僕も今回のことでRailsの仕組みを少し理解できた気がします。
同じように困っている初心者の方の助けになれば幸いです。
質問や感想もぜひコメントくださいね!😊