![](https://sousuke-neosoul.com/wp-content/uploads/2024/03/shirokuma_0829__multi_expressions__plant_male_fairy__illustrati_aec9d435-94c7-41e3-8e11-e3f1686b2c83_2000x2000-1.png)
運営者:そうすけ
愛媛在住のエンジニア兼ブロガー。
工場勤務から社内SEにキャリアチェンジ。
主に社内向けのシステム開発を行っています。
【ブログ運営歴】2021.6~
【プログラミング歴】2022.3~
本業:Java,MySQL、個人:Javascript
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オブジェクトにハッシュとして格納されます。
参考記事
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgwJTkwUmFpbHMlRTMlODAlOTFwYXJhbXMlRTMlODElQTMlRTMlODElQTYlRTMlODElQUElRTMlODIlOTMlRTMlODElQTAlRUYlQkMlOUYmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPWFkNmYzZjY0NzRmYTMyYWMwM2VkMjUwNzgyNzJkM2Vl&mark-x=120&mark-y=96&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDBzbGVlcHlfY2F0JnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1hMjhjMTQ3ODg4NDY2YmRkMjk0YTc2YmVkZTU4ZGRlZQ&blend-x=120&blend-y=500&blend-mode=normal&s=9487794e5254ba1590dc1670e61bb7fd)
クエリパラメータとは
URLに?以降をパラメータとして扱う
URLに?category=1など条件をつけるパラメータ。
パスパラメータとは
URLのパスで変数を受け取る部分。
http://sample.com/place/1の「/place/1」などの部分。
コメント