【rails】showメソッドのエンドポイントでハマった件

運営者:そうすけ

愛媛のエンジニア兼ブロガー。
工場勤務→社内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」などの部分。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次