0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby on Rails】paramsを使ってURLの値を参照してDBのデータを表示させる方法

Last updated at Posted at 2024-04-17

今回の目標

URLがlocalhost:3000/tests/1の時はtestsDBのid:1のデータを表示
URLがlocalhost:3000/tests/2の時はtestsDBのid:2のデータを表示
...
といった形にする。

基本条件
・rutes.rb
・tests_controller.rb
・show.html.erb
・Testモデルtestsテーブル
それらが存在している

やること

①ルーティングの設定を追加
②コントローラーを作成
 params変数を学ぶ
③確認


①ルーティングの設定

1つずつルーティングを設定していくとした場合

routes.rb
get "tests/1" => "tests#show" 
get "tetss/2" => "tests#show"
get "tests/3" => "tests#show"

#それぞれのURLに対してtestsコントローラーのshowアクションを実行する

これでも問題ないが、DBに対応という部分を考えると記載する量が莫大になってしまう。

ひとまとめにして記載することができる

routes.rb
get "tests/:id" => "tests#show"

tests/:id と書くと tests/〇〇 が全て該当する


ここで注意点

間違った記載例

rutes.rb
get "tests/:id" => "tests#show"
get "tests/index" => "tests#index"

ルーティングは上から処理されるため、上のような記載方法だと"localhost3000:tests/index"のURLにアクセスしたときでもtestsコントローラーのshowアクションが実行されてしまう

正しい記載方法

routes.rb
get "tests/index" => "tests#index"
get "tests/:id" => "tests#show"

/:idのような万能なルーティングは一番最後に記載することで誤動作を防ぐ


②コントローラーを作成

ルーティングの設定ができたので次は、コントローラー内の処理を設定していく。
tests_controllerの現状

tests_controller.rb
def show
end

URLとDBを紐づけるために必要なこととして、

  • URL末尾のidごとに取得するデータを変更する
    => URL末尾のidを取得する必要がある

paramsとは

そういった時に助けてくれるのがparamsメソッドらしい
役割:パラメータを取得する
つまり、今回でいうところのURL末尾のidを取得してくれるということだ。
paramsでパラメータを取得する方法はいくつかあるようだが、今回はルートパラメータとしてパラメータを取得するのでその方法に絞ってしっていく。

先ほどルーティングの中でtests/:idと記載した/:idの部分がパラメータの役割を果たしている。
URLの文字列内にコロンがついた部分は文字列としては扱われずに一種の変数として扱われる。
今回ではルーティングで指定した"tests/:id" => "tests#show"によってshowアクションに:idのデータが渡されてページ遷移が行われるといった感じになる。

tests_controller.rb
def show
 @test = Test.find_by(id: params[:id]) #ここでは、:idで示されたパラメータの値が@idに代入される
end

こうすることで、testsテーブル内のid:xのデータを取得し@testに代入された状態になる

show.html.erb
<%= @test.contet %> #urlで指定されたidのデータを表示
<%= @test.created_at %> #urlで指定されたidのデータ生成情報を表示

後は取得したデータが格納されている@testをhtmlに差し込めば無事情報が表示されると言った流れである。

③確認

URL:localhost:3000/tests/1

routes.rb
#ルーティング
get "tests/:id" => "tests#show"
tests_controller.rb
#コントローラー
def show
 @test = Test.find_by(id: params[:id])
show.html.erb
<%= @test.content %> 
<%= @test.created_at %> 

表示されるページ

「1」のデータが表示されているよ
2024/04/17 14:24


こんな感じで表示ができると思います! Xとか掲示板とかで表示されているのをクリックしたらその投稿単独のビューに行ったりするけどそういう時に使われていたりするのでしょうか。分かりませんが、今回はURLとDBのデータを紐づけて表示する方法を知ることができました。

参考にさせていただいた記事

感謝です。ありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?