railsチュートリアル第１３章 マイクロポストを表示する

##マイクロポストを表示する
ユーザーのshowページで直接マイクロポストを表示させる
最初に極めてシンプルなERbテンプレートを作成します。
サンプルデータ生成タスクにマイクロポストのサンプルを追加して、画面にサンプルデータが表示されるようにしてみます。

###マイクロポストの描画
Micropostのコントローラとビューを作成するために、コントローラを生成しましょう。

```rb
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

```html
<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

```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

```html
<% 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
```
クラスは大事らしい。