【Railsチュートリアル】第13章 ユーザーのマイクロポスト②

# 13.2 マイクロポストを表示する
* ユーザープロフィールにマイクロポストを表示させるためのERbテンプレートを作成する
* 画面にサンプルデータが表示されるようにする

## 13.2.1 マイクロポストの描画
* ユーザーのプロフィール画面（show.html.erb）でそのユーザーのマイクロポストを表示させたり、これまでに投稿した総数も表示させたりしていく。

### 演習 1
7.3.3で軽く説明したように、今回ヘルパーメソッドとして使ったtime_ago_in_wordsメソッドは、Railsコンソールのhelperオブジェクトから呼び出すことができます。このhelperオブジェクトのtime_ago_in_wordsメソッドを使って、3.weeks.agoや6.months.agoを実行してみましょう。

```ruby

>> helper.time_ago_in_words(3.weeks.ago)
=> "21 days"

>> helper.time_ago_in_words(6.months.ago)
=> "6 months"
```

### 演習 2
helper.time_ago_in_words(1.year.ago)と実行すると、どういった結果が返ってくるでしょうか?

```ruby
>> helper.time_ago_in_words(1.year.ago)
=> "about 1 year"
```

### 演習 3
micropostsオブジェクトのクラスは何でしょうか? ヒント: リスト 13.23内のコードにあるように、まずはpaginateメソッド（引数はpage: nil）でオブジェクトを取得し、その後classメソッドを呼び出してみましょう。

```ruby
>> u = User.find(1)
   (0.1ms)  begin transaction
  User Load (1.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
>> m = u.microposts.paginate(page: nil)
  Micropost Load (5.7ms)  SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."created_at" DESC LIMIT ? OFFSET ?  [["user_id", 2], ["LIMIT", 11], ["OFFSET", 0]]
   (1.2ms)  SELECT COUNT(*) FROM "microposts" WHERE "microposts"."user_id" = ?  [["user_id", 2]]
=> #<ActiveRecord::AssociationRelation [#<Micropost id: 296, content: "Quasi a omnis enim consequatur.", ...]>
>> m.class
=> Micropost::ActiveRecord_AssociationRelation
```

## 13.2.2 マイクロポストのサンプル
### 演習 1
(1..10).to_a.take(6)というコードの実行結果を推測できますか? 推測した値が合っているかどうか、実際にコンソールを使って確認してみましょう。

```
>> (1..10).to_a.take(6)
=> [1, 2, 3, 4, 5, 6]
```
to_aはハッシュ、範囲オブジェクトなどを配列に変換するメソッド。

### 演習 2
先ほどの演習にあったto_aメソッドの部分は本当に必要でしょうか? 確かめてみてください。

```
>> (1..10).take(6)
=> [1, 2, 3, 4, 5, 6]
```

### 演習 3
Fakerはlorem ipsum以外にも、非常に多種多様の事例に対応しています。Fakerのドキュメント（英語）を眺めながら画面に出力する方法を学び、実際に架空の大学名やHipster IpsumやChuck Norris facts（参考: チャック・ノリスの真実）を画面に出力してみましょう。（訳注: もちろん日本語にも対応していて、例えば沖縄らしい用語を出力するfaker-okinawaもあります。ぜひ遊んでみてください。）

```ruby

>> Faker::Games::Pokemon.name
=> "Chansey"
   # ラッキー
>> Faker::Games::Pokemon.location
=> "Petalburg City"
   # トウカシティ
>> Faker::Games::Pokemon.move
=> "Body Slam"
   # のしかかり
```
ポケモンも対応しているなんでびっくり。

## 13.2.3 プロフィール画面のマイクロポストをテストする
* プロフィール画面で表示されるマイクロポストに対して、統合テストを書いていく

```ruby:test/integration/users_profile_test.rb
require 'test_helper'

class UsersProfileTest < ActionDispatch::IntegrationTest
  include ApplicationHelper

  def setup
    @user = users(:michael)
  end

  test "profile display" do
    # プロフィールページを確認するテスト
    get user_path(@user)
      # プロフィールページにGETリクエスト
    assert_template 'users/show'
      # /users/showページが表示されているか
    assert_select 'title', full_title(@user.name)
      #  タイトル欄にユーザー名が表示されているか
    assert_select 'h1', text: @user.name
      # <h1>にユーザー名が表示されているか
    assert_select 'h1>img.gravatar'
      # <h1>内にimg.gravatarが表示されているか
    assert_match @user.microposts.count.to_s, response.body
      # <body>内にユーザーのマイクロソフト数が表示されているか
    assert_select 'div.pagination'
      # <div>内にpaginationが表示されているか
    @user.microposts.paginate(page: 1).each do |micropost|
      assert_match micropost.content, response.body
        # body内にマイクロソフトが表示されているか
    end
  end
end
```

### 演習 1
リスト 13.28にある２つの'h1'のテストが正しいか確かめるため、該当するアプリケーション側のコードをコメントアウトしてみましょう。テストが green から red に変わることを確認してみてください。

確認のみなので省略

### 演習 2
リスト 13.28にあるテストを変更して、will_paginateが１度のみ表示されていることをテストしてみましょう。ヒント: 表 5.2を参考にしてください。

```ruby
require 'test_helper'

class UsersProfileTest < ActionDispatch::IntegrationTest
  include ApplicationHelper

  def setup
    @user = users(:michael)
  end

  test "profile display" do
    get user_path(@user)
    assert_template 'users/show'
    assert_select 'title', full_title(@user.name)
    assert_select 'h1', text: @user.name
    assert_select 'h1>img.gravatar'
    assert_match @user.microposts.count.to_s, response.body
    assert_select 'div.pagination', count: 1 # この行を変更
    @user.microposts.paginate(page: 1).each do |micropost|
      assert_match micropost.content, response.body
    end
  end
end
```