らくだ🐫にもできるRailsチュートリアル|13.2

13.2 マイクロポストを表示する

マイクロポストの表示予定図はこんな感じ
RoRT本文参照です

ここでは、Twitterのような独立したマイクロポストのindexページは作らずに、図 13.4のモックアップに示したように、ユーザーのshowページで直接マイクロポストを表示させることにします。ユーザープロフィールにマイクロポストを表示させるため、最初に極めてシンプルなERbテンプレートを作成します。次に、10.3.2のサンプルデータ生成タスクにマイクロポストのサンプルを追加して、画面にサンプルデータが表示されるようにしてみます。

13.2.1 マイクロポストの描画

ユーザーのプロフィール画面 (show.html.erb) に、そのユーザーのマイクロポストを表示させたり、そのユーザーが投稿した総数も表示させたりしていく
→一旦データベースをリセット&サンプルデータの再生成

そしてコントローラを生成
(いろいろ生成される中でここではviewのみ使う。コントローラは次の13.3から使用)

ユーザーごとにすべてのマイクロポストを描画

ユーザー一覧と違いulタグではなくolタグを使っている
→マイクロポストが特定の順序に依存しているため

1つのマイクロポストを表示するパーシャル

一つのマイクロポストを表示するためのパーシャル
→/sample_app/app/views/microposts/に_micropost.html.erbファイルを生成

time_ago_in_wordsとは何ぞ

ここではtime_ago_in_wordsというヘルパーメソッドを使っています。これはメソッド名の表すとおりですが、「3分前に投稿」といった文字列を出力します。具体的な効果について13.2.2で説明します。

ページネーションを使って表示

一度にすべてのマイクロポストが表示されてしまうことを防ぐ為に
ユーザー一覧ページと同じくページネーションを導入

上のコードは引数なしで動作していました。これはwill_paginateが、Usersコントローラのコンテキストにおいて、@usersインスタンス変数が存在していることを前提としているためです。

ActiveRecord::Relationクラスな@usersインスタンス変数はUsersコントローラのコンテキスト(Usersコントローラに含まれる情報)なので、同じくUsersコントローラのコンテキスト(であるところのViewのテンプレート上)からwill_paginateを呼び出しているため(@usersが存在するという前提で)will_paginateがよしなにやってくれていた
今回はUsersコントローラのコンテキストから、異なるコンテキストのマイクロポストをページネーションしたいので
(明示的に)@microposts変数をwill_paginateに渡す必要がある

したがって、そのようなインスタンス変数をUsersコントローラのshowアクションで定義しなければなりません

belongs_to/has_manyの関連付けを行っているので
paginateメソッドでmicropostテーブルから必要な(user_idが@user.idと等しい)マイクロポストのページを引き出せる

コンテキストとはなんぞ

Usersコントローラのコンテキスト

Usersコントローラの制御情報

Usersコントローラに含まれる各種アクションや設定など諸々

コンテキストとは、プログラムの実行に必要な各種情報のことである。

「context」(コンテキスト)は、「文脈」、「前後関係」などと訳されるが、IT用語としては意味がイメージしづらく、単にコンテキストとある場合は、何らかの制御情報と考える方がわかりやすいことが多い。

マイクロポストの投稿数の表示

関連付けをとおしてcountメソッドを呼び出せる

要素が出そろったので実装!

新しくなったユーザー詳細ページをブラウザで確認!
しても、マイクロポストがないので表示が変わりません
→次でマイクロポストのサンプルを追加する
その前に演習!

演習

  1. 7.3.3で軽く説明したように、今回ヘルパーメソッドとして使ったtime_ago_in_wordsメソッドは、Railsコンソールのhelperオブジェクトから呼び出すことができます。このhelperオブジェクトのtime_ago_in_wordsメソッドを使って、3.weeks.agoや6.months.agoを実行してみましょう。
  2. helper.time_ago_in_words(1.year.ago)と実行すると、どういった結果が返ってくるでしょうか?
  3. micropostsオブジェクトのクラスは何でしょうか? ヒント: リスト 13.23内のコードにあるように、まずはpaginateメソッド (引数はpage: nil) でオブジェクトを取得し、その後classメソッドを呼び出してみましょう。

1.

2.

3.

2の”約1年”が”1年”じゃないのは仕様だから!という事

13.2.2 マイクロポストのサンプル

マイクロポストのサンプルも追加して表示を確認できるようにしたい!

すべてのユーザーにマイクロポストを追加しようとすると時間が掛かり過ぎるので、takeメソッドを使って最初の6人だけに追加します。(中略)この6人については、1ページの表示限界数 (30) を越えさせるために、それぞれ50個分のマイクロポストを追加するようにしています。

orderメソッドとは何ぞ


上の例は

Faker gemでサンプルを追加

Faker gemのLorem.sentenceというメソッドを使ってsampleを追加する。

「user1のマイクロポスト×50、user2のマイクロポスト×50・・・」ではなく
「user1のマイクロポスト1・・・user6のマイクロポスト1、user1のマイクロポスト2・・・user6のマイクロポスト2」といった繰り返しになっている
→タイムラインを実装するときの見栄えが良い

演習

  1. (1..10).to_a.take(6)というコードの実行結果を推測できますか? 推測した値が合っているかどうか、実際にコンソールを使って確認してみましょう。
  2. 先ほどの演習にあったto_aメソッドの部分は本当に必要でしょうか? 確かめてみてください。
  3. Fakerはlorem ipsum以外にも、非常に多種多様の事例に対応しています。Fakerのドキュメント (英語) を眺めながら画面に出力する方法を学び、実際に大学名や電話番号、Hipster IpsumやChuck Norris facts (参考: チャック・ノリスの真実) を画面に出力してみましょう。(訳注: もちろん日本語にも対応していて、例えば沖縄らしい用語を出力するfaker-okinawaもあります。ぜひ遊んでみてください。)

1.

2.

3.

13.2.3 プロフィール画面のマイクロポストをテストする

プロフィール画面が正しく描画されるかのテストはアカウントの有効化テストで行っている
→ここではプロフィール画面で表示されるマイクロポストに対しての統合テストを書いていく

テストの準備

プロフィール画面におけるマイクロポストをテストするためには、ユーザーに紐付いたマイクロポストのテスト用データが必要になります。

userにuserのnameの値を渡すと、Railsがfixtureファイル内の対応するユーザーを探して、見つかったらマイクロポストに関連付けてくれる
スゴイ!
また、埋め込みRubyを使ってテストデータを追加する

テストを実装

今回のテストでは、プロフィール画面にアクセスした後に、ページタイトルとユーザー名、Gravatar、マイクロポストの投稿数、そしてページ分割されたマイクロポスト、といった順でテストしていきます。

response.bodyとはなんぞ

前にも少し書いてましたが改めて。

response.bodyにはそのページの完全なHTMLが含まれています (HTMLのbodyタグだけではありません)

bodyの内容だけではなくてページ内のすべてのHTMLが含まれるという事

演習

  1. リスト 13.28にある2つの’h1’のテストが正しいか確かめるため、該当するアプリケーション側のコードをコメントアウトしてみましょう。テストが green から redに変わることを確認してみてください。
  2. リスト 13.28にあるテストを変更して、will_paginateが1度のみ表示されていることをテストしてみましょう。ヒント: 表 5.2を参考にしてください。

1.
動作確認のみにて省略

2.

まとめとか感想

細かいところに?!っとなりつつ
全体はスムーズに進められた、と、思います!
見た目が整っていくの楽しい✨

らくだ🐫にもできるRailsチュートリアルとは

「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。
自分用に記録していますが、お役に立つことがあれば幸いです。

調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けますと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです