46日目:Ruby on Rails Ⅲ:データベース応答型、find_by関数、ルーティングのワイルドカード 、params変数(find_by、/:id、params)
<学習日>
46日目
<学習内容>
① Ruby on Rails Ⅲ(0-53%):データベース応答型、find_by関数、ルーティングのワイルドカード 、params変数(find_by、/:id、params)
<参考>
Progateレベル:195
<学習内容詳細>
今日はRuby on Rails Ⅲの半分を完了しました^^
なかなか、ルーティング・コントローラー・ビューを行き来しつつ、きれいなcodeで応答型のアプリケーションを構築するのは難しいですね^^;;
ただびしっとハマるときの快感は健在です!
① Ruby on Rails Ⅲ(0-53%):データベース応答型、find_by関数、ルーティングのワイルドカード 、params変数(find_by、/:id、params)
今日の内容は、とにかく応答型のアプリの骨格の作り方の手順を頭に入れるという感じでした^^
成果物を意識して、なるべくProgate側のリードは見ないでcodeを書こうとするのですが、何かしらエラーが出てきたりして、間違いを探しに行く感じになりますね^^;;
でも、ちょっと時間がかかってもいいので、ちゃんと自分でエラーを解消しに行っています!
自分でcodeを0から書くときは、そういう作業が多くなるのだろうと思うので、慣れておくに越したことはないと思います^^
ではさっそく、具体的なcodeを挙げながら、振り返っていきましょう!
・投稿記事の検索:find_by関数
データベースに格納されているテーブルの中から、欲しい行列を探してくる関数。
具体的にPostモデル(データベース名でもある)から、idが2の情報を探してきて、一時的な変数postに格納するcodeは以下のとおり。
<rails console>
post = Post.find_by(id:2)
基本的な使い方としては、探してきた情報は一度変数に格納する。
探してくるときは、id番号を指定することが一般的(なのかな、今のところ)
・ルーティングのワイルドカード「/:id」について
取得したデータベースのidをurlに反映させることはよくやるが、その全てのurlに対してアクションを指定すると物凄く大変。なので、ワイルドカード的な「/:id」を使うことで対応する。
具体的に、「/posts/1」「/posts/2」のようにpostsのあとにid番号が入っていくurlを、「show」というアクションに全て紐づける場合のcodeは以下のとおり。
<ルート>
get "/posts/:id" => "posts#show"
なお、ルートファイルの中にはいくつかのget関数を書いていくが、上から順番に当てはまるアクションに導くようになってるので、ワイルドカードを使用したget関数は、必要以上に下の階層に記載しておかないと、他のアクションに導きたいurlまで巻き込んでしまうので注意。
今回のケースだと「/posts/index」などは他のアクションに紐づけたいような場合、このget関数よりも上に「get "/posts/:id" => "posts#show"」を記載してしまうと、もろごとshowアクション側に突っ込まれてしまう。
・id番号の取得方法について
データベースのidをurlの末尾に追加するためには、参照したデータベースのidを取得する必要がある。
@idという変数に対して、id番号を格納するための具体的なcodeは以下のとおり。
<コントローラー>
def show
@id = params[:id]
paramasという変数の中に、そのときのルーティングされたときの:idの値が格納される仕組みとなっている。
多分、この言語を作成したときに、こういう機能を作ることを意図していたので、関数や変数レベルで用意されているということ。
・具体的な投稿内容をクリックしたときに、その詳細ページにとび、その詳細ページでは投稿内容の文字と投稿時間を記載するような場合
<ルーティング>
get "post/:id" => "posts#show"
<コントローラー>
def index
@posts = Post.all
end
def show
@post = Post.find_by(id:params[:id])
end
<indexビュー>
<% @posts.each do |post| %>
<%= link_to("post.contet","/posts/#{post.id}") %>
<% end %>
<showビュー>
<%= @post.content %>
<%= @post.created_at %>
簡単に解説すると、
①indexビューでデータベースのcententを文字列としてもち、「/posts/id番号」をurlのリンク情報として持つリンクボタンを作成
②ルーティングで「/posts/:id」に対して、showアクションを紐づけ
③コントローラーで@postの変数に、urlの末尾のidと一致するデータを格納
④showビューにて、クリックしたデータベースのidと一致するデータベースのcontentとcreated_atの情報を提示
この辺で、作成する機能の1つ目が完了したので、本日はここまでです!
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!