運営者:そうすけ
愛媛のエンジニア兼ブロガー。
工場勤務→社内SE→自社開発にキャリアチェンジ。
主にバックエンド開発を行っています。
【ブログ運営歴】2021.6~
【プログラミング歴】2022.3~
本業:Java,MySQL、個人:Typescript
railsのshowメソッドを使用するときに理解できておらずハマりました。
問題
VUE側から店舗の情報を取り出すため、GETリクエストでIDを指定するとき大いになる間違えをしていました。
私が指定したエンドポイントです。
(かなり恥ずかしいですが、備忘録のために書きましす)
/api/v1/places/show?id=1
するとid=showと判断され、ログが出てエラーになりました。
2024-03-17 07:49:39 Started GET "/api/v1/places/show?id=1" for 172.23.0.1 at 2024-03-17 07:49:39 +0900
2024-03-17 07:49:39 Processing by Api::V1::PlacesController#show as */*
2024-03-17 07:49:39 Parameters: {"id"=>"show"}
2024-03-17 07:49:40 {"id"=>"show", "controller"=>"api/v1/places", "action"=>"show"}
2024-03-17 07:49:40 Completed 400 Bad Request in 31ms (ActiveRecord: 0.0ms | Allocations: 1125)
showメソッドとは
showメソッドはrailsに標準でついているメソッドで指定のHTTPメソッドとパスが来た時に実行されます。
placeモデルを使用した場合、showメソッドは①GETリクエストで②/api/v1/places/:idというパラメーターが来ると実行されます。
rails routesコマンドで指定したコマンドを見るとルーティング設定が出てきます。
api_v1_places GET /api/v1/places(.:format) api/v1/places#index
api_v1_place GET /api/v1/places/:id(.:format) api/v1/places#show
つまり、railsは
・GETリクエストで「/モデル」ならば、indexを、
・GETリクエストで「/モデル/〇〇」ならば、〇〇を:idの変数として判断し、showメソッドを実行します。
つまり私の初歩的なミスは、以下の通りです。
- 実行メソッドをエンドポイントとして指定していた
- idをパスパラメータではなく、クエリパラメータとして指定していた。
クエリパラメータとパラメータをしっかり理解しよう
railsのルーティングはパスパラメータです。
そしてshowメソッドのIDの受け渡しはパラメータです。
基本的にはパスパラメータで指定されることが多く通常クエリパラメータに入れないそうです。(chatgpt調べ)
railsで何気なく使うparamsですが、クエリパラメータ、パスパラメータ、ポストパラメータの3つをを自動的に判断してparamsオブジェクトにハッシュとして格納されます。
参考記事
クエリパラメータとは
URLに?以降をパラメータとして扱う
URLに?category=1など条件をつけるパラメータ。
パスパラメータとは
URLのパスで変数を受け取る部分。
http://sample.com/place/1の「/place/1」などの部分。
コメント