今回の目標
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つずつルーティングを設定していくとした場合
get "tests/1" => "tests#show"
get "tetss/2" => "tests#show"
get "tests/3" => "tests#show"
#それぞれのURLに対してtestsコントローラーのshowアクションを実行する
これでも問題ないが、DBに対応という部分を考えると記載する量が莫大になってしまう。
ひとまとめにして記載することができる
get "tests/:id" => "tests#show"
tests/:id
と書くと tests/〇〇
が全て該当する
ここで注意点
間違った記載例
get "tests/:id" => "tests#show"
get "tests/index" => "tests#index"
ルーティングは上から処理されるため、上のような記載方法だと"localhost3000:tests/index"のURLにアクセスしたときでもtestsコントローラーのshowアクションが実行されてしまう
正しい記載方法
get "tests/index" => "tests#index"
get "tests/:id" => "tests#show"
/:idのような万能なルーティングは一番最後に記載することで誤動作を防ぐ
②コントローラーを作成
ルーティングの設定ができたので次は、コントローラー内の処理を設定していく。
tests_controllerの現状
def show
end
URLとDBを紐づけるために必要なこととして、
- URL末尾のidごとに取得するデータを変更する
=> URL末尾のidを取得する必要がある
paramsとは
そういった時に助けてくれるのがparamsメソッドらしい
役割:パラメータを取得する
つまり、今回でいうところのURL末尾のidを取得してくれるということだ。
paramsでパラメータを取得する方法はいくつかあるようだが、今回はルートパラメータとしてパラメータを取得するのでその方法に絞ってしっていく。
先ほどルーティングの中でtests/:id
と記載した/:id
の部分がパラメータの役割を果たしている。
URLの文字列内にコロンがついた部分は文字列としては扱われずに一種の変数として扱われる。
今回ではルーティングで指定した"tests/:id" => "tests#show"
によってshowアクションに:id
のデータが渡されてページ遷移が行われるといった感じになる。
def show
@test = Test.find_by(id: params[:id]) #ここでは、:idで示されたパラメータの値が@idに代入される
end
こうすることで、testsテーブル内のid:x
のデータを取得し@test
に代入された状態になる
<%= @test.contet %> #urlで指定されたidのデータを表示
<%= @test.created_at %> #urlで指定されたidのデータ生成情報を表示
後は取得したデータが格納されている@test
をhtmlに差し込めば無事情報が表示されると言った流れである。
③確認
URL:localhost:3000/tests/1
#ルーティング
get "tests/:id" => "tests#show"
#コントローラー
def show
@test = Test.find_by(id: params[:id])
<%= @test.content %>
<%= @test.created_at %>
表示されるページ
「1」のデータが表示されているよ
2024/04/17 14:24
こんな感じで表示ができると思います! Xとか掲示板とかで表示されているのをクリックしたらその投稿単独のビューに行ったりするけどそういう時に使われていたりするのでしょうか。分かりませんが、今回はURLとDBのデータを紐づけて表示する方法を知ることができました。
参考にさせていただいた記事
感謝です。ありがとうございます。