##マイクロポストを表示する
ユーザーのshowページで直接マイクロポストを表示させる
最初に極めてシンプルなERbテンプレートを作成します。
サンプルデータ生成タスクにマイクロポストのサンプルを追加して、画面にサンプルデータが表示されるようにしてみます。
###マイクロポストの描画
Micropostのコントローラとビューを作成するために、コントローラを生成しましょう。
ubuntu:~/environment/sample_app (user-microposts) $ rails generate controller Microposts
Running via Spring preloader in process 3861
create app/controllers/microposts_controller.rb
invoke erb
create app/views/microposts
invoke test_unit
create test/controllers/microposts_controller_test.rb
invoke helper
create app/helpers/microposts_helper.rb
invoke test_unit
invoke assets
invoke scss
create app/assets/stylesheets/microposts.scss
今回の目的は、ユーザー毎にすべてのマイクロポストを描画できるようにする
###1つのマイクロポストを表示するパーシャル
app/views/microposts/_micropost.html.erb
<li id="micropost-<%= micropost.id %>">
<%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
<span class="user"><%= link_to micropost.user.name, micropost.user %></span>
<span class="content"><%= micropost.content %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(micropost.created_at) %> ago.
<!--メソッド名の表すとおりですが、「3分前に投稿」といった文字列を出力します。-->
</span>
</li>
###@micropostsインスタンス変数をshowアクションに追加する
app/controllers/users_controller.rb
class UsersController < ApplicationController
.
.
.
def show
@user = User.find(params[:id])
# データベースからユーザー情報を取り出す
@microposts = @user.microposts.paginate(page: params[:page])
# @microposts変数をwill_paginateに渡す必要なためここで定義しなければならない。
# Usersコントローラのコンテキストにおいて、
# @usersインスタンス変数が存在していることを前提としているため
.
.
.
end
####マイクロポストをユーザーのshowページ(プロフィール画面)に追加する
app/views/users/show.html.erb
<% provide(:title, @user.name) %>
<div class="row">
<!--サイドバーを表示させる-->
<aside class="col-md-4">
<!--サイドバーを表示させる-->
<section class="user_info">
<h1>
<%= gravatar_for @user %>
<%= @user.name %>
</h1>
</section>
</aside>
<div class="col-md-8">
<% if @user.microposts.any? %>
<!--ユーザーのマイクロポストが1つもない場合には空のリストを表示させていない-->
<h3>Microposts (<%= @user.microposts.count %>)</h3>
<!--マイクロポストの数を数える-->
<ol class="microposts">
<!--ol マイクロポストが特定の順序(新しい→古い)に依存しているため-->
<%= render @microposts %>
<!--マイクロポストを表示させる-->
</ol>
<%= will_paginate @microposts %>
<!--マイクロポストをページネーション-->
<% end %>
</div>
</div>
###演習
1.
7.3.3で軽く説明したように、今回ヘルパーメソッドとして使ったtime_ago_in_wordsメソッドは、Railsコンソールのhelperオブジェクトから呼び出すことができます。このhelperオブジェクトのtime_ago_in_wordsメソッドを使って、3.weeks.agoや6.months.agoを実行してみましょう。
>> helper.time_ago_in_words(3.weeks.ago)
=> "21 days"
>> helper.time_ago_in_words(6.weeks.ago)
=> "about 1 month"
2.helper.time_ago_in_words(1.year.ago)と実行すると、どういった結果が返ってくるでしょうか?
>> helper.time_ago_in_words(1.year.ago)
=> "about 1 year"
3.micropostsオブジェクトのクラスは何でしょうか? ヒント: リスト 13.23内のコードにあるように、まずはpaginateメソッド(引数はpage: nil)でオブジェクトを取得し、その後classメソッドを呼び出してみましょう。
>> microposts = user.microposts.paginate(page: nil)
Micropost Load (0.7ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."created_at" DESC LIMIT ? OFFSET ? [["user_id", 1], ["LIMIT", 11], ["OFFSET", 0]]
=> #<ActiveRecord::AssociationRelation []>
>> microposts.class
=> Micropost::ActiveRecord_AssociationRelation
クラスは大事らしい。