アプリをつくる　マイクロポストを表示する

###マイクロポストコントローラを生成
```
ubuntu:~/environment/my_app (user-microposts) $ rails generate controller Microposts
Running via Spring preloader in process 4323
      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
```
###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.
  </span>
</li>
```
1つのマイクロポストを表示するパーシャル

###app/controllers/users_controller.rb
```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy
  
  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
    # マイクロポストのインスタンス変数
    # マイクロポストにページネーションを作る
      # page: params[:page]の意味がわからん
      # デフォルトで３０件
  end
 
  def new
    @user = User.new
  end
  
  def create
    @user = User.new(user_params) 
    if @user.save
      @user.send_activation_email
      # メソッドを使ってメールを送信する
      flash[:info] = "メールをチェックしてアカウントを有効にしてください。"
      redirect_to root_url
    else
      render 'new'
    end
  end
  
  def edit
    @user = User.find(params[:id])
  end
  
  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
      flash[:success] = "プロフィールを更新しました。"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "ログアウトされました。"
    redirect_to users_url
  end
  
  private
  
    def user_params
      params.require(:user).permit(:name, :email, :password, 
                                     :password_confirmation)
    end
    
    def logged_in_user
      unless logged_in?
        store_location
        flash[:danger] = "ログインしてください。"
        redirect_to login_url
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
    end
    
    # 管理者かどうか確認
    def admin_user
      redirect_to(root_url) unless current_user.admin?
    end
end
```
###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? %>
      <h3>Microposts (<%= @user.microposts.count %>)</h3>
        <!--@user.microposts.conut
              マイクロポストの数を表示
        -->
      <ol class="microposts">
        <%= render @microposts %>
          <!--一つのマイクロポストを表示させるパーシャル-->
      </ol>
      <%= will_paginate @microposts %>
        <!--micropostコントローラでページネーションを作成されている。-->
    <% end %>
  </div>
</div>
```
###db/seeds.rb
```rb
# メインのサンプルユーザーを1人作成する
User.create!(name:  "Example User",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar",
             admin: true,
             activated: true,
             activated_at: Time.zone.now)

# 追加のユーザーをまとめて生成する
99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password,
               activated: true,
               activated_at: Time.zone.now)
               
# ユーザーの一部を対象にマイクロポストを生成する
users = User.order(:created_at).take(6)
# dbから作成時刻に並び替えて6件のレコードを取得(多分、昇順）
  # .take()
    # モデル.take(件数=nil)
    # 引数で指定した件数のレコードを取得
50.times do
# 50回以下の処理を行う
  content = Faker::Lorem.sentence(word_count: 5)
  # 5文字のダミーデータを返す
    # Faker:: 
      # ダミーデータを作成できる
      # ------------------------------
      # 2.6.3 :001 > Faker::Address.city
      # => "Greenborough" 
      # 2.6.3 :002 > Faker::Address.city
      # => "Raynorshire" 
      # ------------------------------
      # ランダムでデータを出してくれる

    # Lorem.sentence(word_count: 5)
      # Lorem ダミーテキスト「lorem ipsum」の略。
      # word_count: 5
        # 5文字
users.each { |user| user.microposts.create!(content: content) }
# 6件から一つづつ取り出す
  # |user|はeach文で変数を表す
    # -----------------------------
    # range = 5..10
      #=> 5..10 
    # 2.6.3 :004 > range.each{|num|
    # 2.6.3 :005 >       print("num = ", num)
    # 2.6.3 :006?>   }
    #   num = 5num = 6num = 7num = 8num = 9num = 10 => 5..10 
    # -----------------------------   
end
```
###データベースをリセットする 再び生成する
```
$ rails db:migrate:reset
$ rails db:seed
```
###app/assets/stylesheets/custom.scss
```scss
.
.
.
/* microposts */

.microposts {
  list-style: none;
  padding: 0;
  li {
    padding: 10px 0;
    border-top: 1px solid #e8e8e8;
  }
  .user {
    margin-top: 5em;
    padding-top: 0;
  }
  .content {
    display: block;
    margin-left: 60px;
    img {
      display: block;
      padding: 5px 0;
    }
  }
  .timestamp {
    color: $gray-light;
    display: block;
    margin-left: 60px;
  }
  .gravatar {
    float: left;
    margin-right: 10px;
    margin-top: 5px;
  }
}

aside {
  textarea {
    height: 100px;
    margin-bottom: 5px;
  }
}

span.image {
  margin-top: 10px;
  input {
    border: 0;
  }
}
```
cssは後でやる

###プロフィール画面のマイクロポストをテスト(統合テスト）を生成
```
ubuntu:~/environment/my_app (user-microposts) $ rails generate integration_test users_profile
Running via Spring preloader in process 8805
      invoke  test_unit
      create    test/integration/users_profile_test.rb
```
未だに統合テストの使い所がわからない

###test/fixtures/microposts.yml テストデータを作成
```yml
orange:
  content: "I just ate an orange!"
  created_at: <%= 10.minutes.ago %>
  user: michael

tau_manifesto:
  content: "Check out the @tauday site by @mhartl: https://tauday.com"
  created_at: <%= 3.years.ago %>
  user: michael

cat_video:
  content: "Sad cats are sad: https://youtu.be/PKffm2uI4dk"
  created_at: <%= 2.hours.ago %>
  user: michael

most_recent:
  content: "Writing a short test"
  created_at: <%= Time.zone.now %>
  user: michael
  
<% 30.times do |n| %>
# 30回以下の処理を繰り返す
micropost_<%= n %>:
  content: <%= Faker::Lorem.sentence(word_count: 5) %>
  # ダミーのテキストを生成（5単語以内）
  created_at: <%= 42.days.ago %>
  # 作成日 42日前
  user: michael
<% end %>
```
###test/integration/users_profile_test.rb
```rb
require 'test_helper'

class UsersProfileTest < ActionDispatch::IntegrationTest
  include ApplicationHelper

  def setup
    @user = users(:michael)
    # テストユーザーをインスタンス変数に返す
  end

  test "profile display" do
    get user_path(@user)
    # ユーザーページを表示を要求する
      # showアクションが作動する
    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'
    @user.microposts.paginate(page: 1).each do |micropost|
      assert_match micropost.content, response.body
    end
  end
end
```
###テストをする
```
ubuntu:~/environment/my_app (user-microposts) $ rails t
/home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-6.0.3/lib/abstract_controller/helpers.rb:152:in `rescue in block in modules_for_helpers': Missing helper file helpers/microposts_helper.rb (AbstractController::Helpers::MissingHelperError)
        from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-6.0.3/lib/abstract_controller/helpers.rb:149:in `block in modules_for_helpers'
.
.
.        
2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from -e:1:in `<main>'
ubuntu:~/environment/my_app (user-microposts) $ spring stop
Spring stopped.
ubuntu:~/environment/my_app (user-microposts) $ rails t
Running via Spring preloader in process 10696
Run options: --seed 32403

# Running:

.........................................

Finished in 9.348758s, 4.3856 runs/s, 27.0624 assertions/s.
41 runs, 253 assertions, 0 failures, 0 errors, 0 skips
```
spring stopで解消
意味はわからない