Ruby on Rails チュートリアル(第4版)　第13章

##13.1.1　演習
1.RailsコンソールでMicropost.newを実行し、インスタンスを変数micropostに代入してください。その後、user_idに最初のユーザーのidを、contentに "Lorem ipsum" をそれぞれ代入してみてください。この時点では、 micropostオブジェクトのマジックカラム (created_atとupdated_at) には何が入っているでしょうか?

```
>> micropost = Micropost.new
=> #<Micropost id: nil, content: nil, user_id: nil, created_at: nil, updated_at: nil>
>> micropost.user_id = 1
=> 1
>> micropost.content = "Lorem ipsum"
=> "Lorem ipsum"
>> micropost
=> #<Micropost id: nil, content: "Lorem ipsum", user_id: 1, created_at: nil, updated_at: nil>
```

2.先ほど作ったオブジェクトを使って、micropost.userを実行してみましょう。どのような結果が返ってくるでしょうか? また、micropost.user.nameを実行した場合の結果はどうなるでしょうか?

```
>> micropost.user
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2020-07-18 13:20:13", updated_at: "2020-07-23 15:00:35", password_digest: "$2a$10$qFFzrhOelczLx3DO.2p6quDaFlV5T1ciSrCbDXTe44d...", remember_digest: nil, admin: true, activation_digest: "$2a$10$OBqUPKe0HwaDUBtqARDRzO9NSFaoKAPHmjNzuTvoqz1...", activated: true, activated_at: "2020-07-18 13:20:13", reset_digest: "$2a$10$HwxkqWWqbizL4WV0Z8G4TuiCHSQsNR.Ce.mg5xsbB/....", reset_sent_at: "2020-07-23 16:07:58">
>> micropost.user.name
=> "Example User"
```

3.先ほど作ったmicropostオブジェクトをデータベースに保存してみましょう。この時点でもう一度マジックカラムの内容を調べてみましょう。今度はどのような値が入っているでしょうか?

```
>> micropost.save
   (0.1ms)  begin transaction
  SQL (2.4ms)  INSERT INTO "microposts" ("content", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["content", "Lorem ipsum"], ["user_id", 1], ["created_at", "2020-07-24 14:59:51.939467"], ["updated_at", "2020-07-24 14:59:51.939467"]]
   (7.0ms)  commit transaction
=> true
>> micropost
=> #<Micropost id: 1, content: "Lorem ipsum", user_id: 1, created_at: "2020-07-24 14:59:51", updated_at: "2020-07-24 14:59:51">
```

##13.1.2　演習
1.Railsコンソールを開き、user_idとcontentが空になっているmicropostオブジェクトを作ってみてください。このオブジェクトに対してvalid?を実行すると、失敗することを確認してみましょう。また、生成されたエラーメッセージにはどんな内容が書かれているでしょうか?

```
>> micropost = Micropost.new
=> #<Micropost id: nil, content: nil, user_id: nil, created_at: nil, updated_at: nil>
>> micropost.valid?
=> false
>> micropost.errors.messages
=> {:user=>["must exist"], :user_id=>["can't be blank"], :content=>["can't be blank"]}
```

2.コンソールを開き、今度はuser_idが空でcontentが141文字以上のmicropostオブジェクトを作ってみてください。このオブジェクトに対してvalid?を実行すると、失敗することを確認してみましょう。また、生成されたエラーメッセージにはどんな内容が書かれているでしょうか?

```
>> micropost = Micropost.new
=> #<Micropost id: nil, content: nil, user_id: nil, created_at: nil, updated_at: nil>
>> micropost.content = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
>> micropost.valid?
=> false
>> micropost.errors.messages
=> {:user=>["must exist"], :user_id=>["can't be blank"], :content=>["is too long (maximum is 140 characters)"]}
```

##13.1.3　演習
1.データベースにいる最初のユーザーを変数userに代入してください。そのuserオブジェクトを使ってmicropost = user.microposts.create(content: "Lorem ipsum")を実行すると、どのような結果が得られるでしょうか?

```
>> micropost = user.microposts.create(content: "Lorem ipsum")
   (0.1ms)  begin transaction
  SQL (2.7ms)  INSERT INTO "microposts" ("content", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["content", "Lorem ipsum"], ["user_id", 1], ["created_at", "2020-07-24 15:37:48.474081"], ["updated_at", "2020-07-24 15:37:48.474081"]]
   (7.6ms)  commit transaction
=> #<Micropost id: 2, content: "Lorem ipsum", user_id: 1, created_at: "2020-07-24 15:37:48", updated_at: "2020-07-24 15:37:48">
```

2.先ほどの演習課題で、データベース上に新しいマイクロポストが追加されたはずです。user.microposts.find(micropost.id)を実行して、本当に追加されたのかを確かめてみましょう。また、先ほど実行したmicropost.idの部分をmicropostに変更すると、結果はどうなるでしょうか?

```
>> user.microposts.find(micropost.id)
  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? AND "microposts"."id" = ? LIMIT ?  [["user_id", 1], ["id", 1], ["LIMIT", 1]]
=> #<Micropost id: 1, content: "Lorem ipsum", user_id: 1, created_at: "2020-07-24 14:59:51", updated_at: "2020-07-24 14:59:51">
>> user.microposts.find(micropost)
Traceback (most recent call last):
        1: from (irb):8
ArgumentError (You are passing an instance of ActiveRecord::Base to `find`. Please pass the id of the object by calling `.id`.)
```

3.user == micropost.userを実行した結果はどうなるでしょうか? また、user.microposts.first == micropost を実行した結果はどうなるでしょうか? それぞれ確認してみてください。

```
>> user == micropost.user
=> true
>> user.microposts.first == micropost
  Micropost Load (0.1ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."id" ASC LIMIT ?  [["user_id", 1], ["LIMIT", 1]]
=> true
```

##13.1.4　演習
1.Micropost.first.created_atの実行結果と、Micropost.last.created_atの実行結果を比べてみましょう。
　13.1.1　の演習の後で休憩して、また13.1.1の演習やっちゃったのでmicropostがちょうど2つあった！

```
>> Micropost.first.created_at
  Micropost Load (1.0ms)  SELECT  "microposts".* FROM "microposts" ORDER BY "microposts"."created_at" DESC LIMIT ?  [["LIMIT", 1]]
=> Fri, 24 Jul 2020 15:37:48 UTC +00:00
>> Micropost.last.created_at
  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" ORDER BY "microposts"."created_at" ASC LIMIT ?  [["LIMIT", 1]]
=> Fri, 24 Jul 2020 14:59:51 UTC +00:00
```

2.Micropost.firstを実行したときに発行されるSQL文はどうなっているでしょうか? 同様にして、Micropost.lastの場合はどうなっているでしょうか? ヒント: それぞれをコンソール上で実行したときに表示される文字列が、SQL文になります。

```
>> Micropost.first
  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" ORDER BY "microposts"."created_at" DESC LIMIT ?  [["LIMIT", 1]]
=> #<Micropost id: 2, content: "Lorem ipsum", user_id: 1, created_at: "2020-07-24 15:37:48", updated_at: "2020-07-24 15:37:48">
>> Micropost.last
  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" ORDER BY "microposts"."created_at" ASC LIMIT ?  [["LIMIT", 1]]
=> #<Micropost id: 1, content: "Lorem ipsum", user_id: 1, created_at: "2020-07-24 14:59:51", updated_at: "2020-07-24 14:59:51">
```

3.データベース上の最初のユーザーを変数userに代入してください。そのuserオブジェクトが最初に投稿したマイクロポストのidはいくつでしょうか? 次に、destroyメソッドを使ってそのuserオブジェクトを削除してみてください。削除すると、そのuserに紐付いていたマイクロポストも削除されていることをMicropost.findで確認してみましょう。

```
>> user = User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2020-07-18 13:20:13", updated_at: "2020-07-23 15:00:35", password_digest: "$2a$10$qFFzrhOelczLx3DO.2p6quDaFlV5T1ciSrCbDXTe44d...", remember_digest: nil, admin: true, activation_digest: "$2a$10$OBqUPKe0HwaDUBtqARDRzO9NSFaoKAPHmjNzuTvoqz1...", activated: true, activated_at: "2020-07-18 13:20:13", reset_digest: "$2a$10$HwxkqWWqbizL4WV0Z8G4TuiCHSQsNR.Ce.mg5xsbB/....", reset_sent_at: "2020-07-23 16:07:58">
>> user.microposts.first.id
  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."created_at" DESC LIMIT ?  [["user_id", 1], ["LIMIT", 1]]
=> 2
>> user.destroy
   (0.1ms)  begin transaction
  Micropost Load (0.2ms)  SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."created_at" DESC  [["user_id", 1]]
  SQL (2.2ms)  DELETE FROM "microposts" WHERE "microposts"."id" = ?  [["id", 2]]
  SQL (0.1ms)  DELETE FROM "microposts" WHERE "microposts"."id" = ?  [["id", 1]]
  SQL (0.7ms)  DELETE FROM "users" WHERE "users"."id" = ?  [["id", 1]]
   (7.8ms)  commit transaction
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2020-07-18 13:20:13", updated_at: "2020-07-23 15:00:35", password_digest: "$2a$10$qFFzrhOelczLx3DO.2p6quDaFlV5T1ciSrCbDXTe44d...", remember_digest: nil, admin: true, activation_digest: "$2a$10$OBqUPKe0HwaDUBtqARDRzO9NSFaoKAPHmjNzuTvoqz1...", activated: true, activated_at: "2020-07-18 13:20:13", reset_digest: "$2a$10$HwxkqWWqbizL4WV0Z8G4TuiCHSQsNR.Ce.mg5xsbB/....", reset_sent_at: "2020-07-23 16:07:58">
>> Micropost.find_by(user_id:1)
  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."created_at" DESC LIMIT ?  [["user_id", 1], ["LIMIT", 1]]
=> nil
```

##13.2.1　演習
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.months.ago)
=> "6 months"
```

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メソッドを呼び出してみましょう。

```
>> user = User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2020-07-24 15:57:45", updated_at: "2020-07-24 15:57:45", password_digest: "$2a$10$yzLVq462FQ51EbIhDs4FiuPyt1.WstZxPXZX2dDelpX...", remember_digest: nil, admin: true, activation_digest: "$2a$10$jw5ZFmNfN1SKy56aWVmoWumqyJOgVG9O4D71auy.2FM...", activated: true, activated_at: "2020-07-24 15:57:45", reset_digest: nil, reset_sent_at: nil>
>> microposts = user.microposts.paginate(page: nil)
  Micropost Load (0.1ms)  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
```

##13.2.2　演習
1.(1..10).to_a.take(6)というコードの実行結果を推測できますか? 推測した値が合っているかどうか、実際にコンソールを使って確認してみましょう。
　 1～10までの配列から6個。`1,2,3,4,5,6`と予想！

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

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もあります。ぜひ遊んでみてください。)
　省略

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

2.リスト 13.28にあるテストを変更して、will_paginateが１度のみ表示されていることをテストしてみましょう。ヒント: 表 5.2を参考にしてください。
　`assert_select 'div.pagination', count: 1`

##13.3.1　演習
1.なぜUsersコントローラ内にあるlogged_in_userフィルターを残したままにするとマズイのでしょうか? 考えてみてください。
　DRYじゃないから。

##13.3.2　演習
1.Homeページをリファクタリングして、if-else文の分岐のそれぞれに対してパーシャルを作ってみましょう。

```ruby:/app/views/static_pages/home.html.erb
<% if logged_in? %>
  <%= render 'static_pages/form' %>
<% else %>
  <%= render 'static_pages/home' %>
<% end %>
```

```ruby:/app/views/static_pages/_form.html.erb
<div class="row">
  <aside class="col-md-4">
    <section class="user_info">
      <%= render 'shared/user_info' %>
    </section>
    <section class="micropost_form">
      <%= render 'shared/micropost_form' %>
    </section>
  </aside>
</div>
```

```ruby:/app/views/static_pages/_home.html.erb
<div class="center jumbotron">
  <h1>Welcome to the Sample App</h1>

  <h2>
    This is the home page for the
    <a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
    sample application.
  </h2>

  <%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %>
</div>

<%= link_to image_tag("rails.png", alt: "Rails logo"),
            'http://rubyonrails.org/' %>
```

##13.3.3　演習
1.新しく実装したマイクロポストの投稿フォームを使って、実際にマイクロポストを投稿してみましょう。Railsサーバーのログ内にあるINSERT文では、どういった内容をデータベースに送っているでしょうか? 確認してみてください。
　`INSERT INTO "microposts" ("content", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["content", "test"], ["user_id", 1], ["created_at", "2020-07-24 17:11:12.992282"], ["updated_at", "2020-07-24 17:11:12.992282"]]`

2.コンソールを開き、user変数にデータベース上の最初のユーザーを代入してみましょう。その後、Micropost.where("user_id = ?", user.id)とuser.microposts、そしてuser.feedをそれぞれ実行してみて、実行結果がすべて同じであることを確認してみてください。ヒント: ==で比較すると結果が同じかどうか簡単に判別できます。

```
>> user = User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2020-07-24 16:10:08", updated_at: "2020-07-24 16:10:08", password_digest: "$2a$10$tQRLa33AWEnVY6Iv0P6QJeW6zfanS6l.Wux54rFANYO...", remember_digest: nil, admin: true, activation_digest: "$2a$10$dHd0zoYxFpnvto1Yf/wBd.XViarjimYcpZgUluQAg0m...", activated: true, activated_at: "2020-07-24 16:10:08", reset_digest: nil, reset_sent_at: nil>
>> micropost = Micropost.where("user_id = ?", user.id)
  Micropost Load (0.5ms)  SELECT  "microposts".* FROM "microposts" WHERE (user_id = 1) ORDER BY "microposts"."created_at" DESC LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Micropost id: 301, content: "test", user_id: 1, created_at: "2020-07-24 17:11:12", updated_at: "2020-07-24 17:11:12">, #<Micropost id: 295, content: "Ipsa sapiente et eum omnis magnam assumenda aut fu...", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, #<Micropost id: 289, content: "Atque eos aut minima commodi qui voluptatem adipis...", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, #<Micropost id: 283, content: "Dolores labore nesciunt est suscipit.", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, #<Micropost id: 277, content: "Libero consequatur eos aut est omnis qui quisquam ...", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, #<Micropost id: 271, content: "Odit natus nesciunt dolorem sunt.", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, #<Micropost id: 265, content: "Aut sed dolor autem asperiores aliquid voluptates ...", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, #<Micropost id: 259, content: "Quia dolores necessitatibus labore et magnam.", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, #<Micropost id: 253, content: "Quidem aut unde ut dolor omnis voluptatum.", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, #<Micropost id: 247, content: "Aperiam ut harum neque nesciunt distinctio et dolo...", user_id: 1, created_at: "2020-07-24 16:10:28", updated_at: "2020-07-24 16:10:28">, ...]>
>> micropost == user.microposts
  Micropost Load (0.4ms)  SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."created_at" DESC  [["user_id", 1]]
  Micropost Load (0.3ms)  SELECT "microposts".* FROM "microposts" WHERE (user_id = 1) ORDER BY "microposts"."created_at" DESC
=> true
>> micropost == user.feed
=> true
```

##13.3.4　演習
1.マイクロポストを作成し、その後、作成したマイクロポストを削除してみましょう。次に、Railsサーバーのログを見てみて、DELETE文の内容を確認してみてください。
　`DELETE FROM "microposts" WHERE "microposts"."id" = ?  [["id", 302]]`

2.redirect_to request.referrer || root_urlの行をredirect_back(fallback_location: root_url)と置き換えてもうまく動くことを、ブラウザを使って確認してみましょう (このメソッドはRails 5から新たに導入されました)。
　省略

##13.55マイクロポストのUIに対する統合テストがREDでエラー。

```

ERROR["test_micropost_interface", MicropostsInterfaceTest, 2.046640218999528]
 test_micropost_interface#MicropostsInterfaceTest (2.05s)
ActionView::Template::Error:         ActionView::Template::Error: Missing partial microposts/_form, application/_form with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:
          * "/home/ec2-user/environment/sample_app/app/views"
        
            app/views/static_pages/home.html.erb:2:in `_app_views_static_pages_home_html_erb___2042311693849903102_70052435259280'
            app/controllers/microposts_controller.rb:12:in `create'
            test/integration/microposts_interface_test.rb:15:in `block (2 levels) in <class:MicropostsInterfaceTest>'
            test/integration/microposts_interface_test.rb:14:in `block in <class:MicropostsInterfaceTest>'
```

前の演習で移動したパーシャルが原因っぽい。
[rails tutorial 13章の演習問題で疑問](https://teratail.com/questions/143554)
こちらを参考に、13.3.2の演習の部分を訂正したらGREENに。

##13.5.5　演習
1.リスト 13.55で示した４つのコメント (「無効な送信」など) のそれぞれに対して、テストが正しく動いているか確認してみましょう。具体的には、対応するアプリケーション側のコードをコメントアウトし、テストが redになることを確認し、元に戻すと greenになることを確認してみましょう。
　省略

2.サイドバーにあるマイクロポストの合計投稿数をテストしてみましょう。このとき、単数形 (micropost) と複数形 (microposts) が正しく表示されているかどうかもテストしてください。ヒント: リスト 13.57を参考にしてみてください。

```
  test "micropost sidebar count" do
    log_in_as(@user)
    get root_path
    assert_match "#{@user.microposts.count} microposts", response.body
    # まだマイクロポストを投稿していないユーザー
    other_user = users(:malory)
    log_in_as(other_user)
    get root_path
    assert_match "0 microposts", response.body
    other_user.microposts.create!(content: "A micropost")
    get root_path
    assert_match "1 micropost", response.body
  end
```

##13.59のテストがREDのエラー。
　GREENになるはずのテストがRED。サーバー再起動しても、ターミナル作り直してもダメ。
　[Railsチュートリアル中にNameError: uninitialized constant Micropost::PictureUploaderが出た時の対処法](https://qiita.com/yokoyan/items/0f82fc3eede75cd6db55)
　こちらを参考にspringを再起動。無事GREENに。

##13.4.1　演習
1.画像付きのマイクロポストを投稿してみましょう。もしかして、大きすぎる画像が表示されてしまいましたか? (心配しないでください、次の13.4.3でこの問題を直します)。
　省略

2.リスト 13.63に示すテンプレートを参考に、13.4で実装した画像アップローダーをテストしてください。テストの準備として、まずはサンプル画像をfixtureディレクトリに追加してください (コマンド例: cp app/assets/images/rails.png test/fixtures/)。リスト 13.63で追加したテストでは、Homeページにあるファイルアップロードと、投稿に成功した時に画像が表示されているかどうかをチェックしています。なお、テスト内にあるfixture_file_uploadというメソッドは、fixtureで定義されたファイルをアップロードする特別なメソッドです18 。ヒント: picture属性が有効かどうかを確かめるときは、11.3.3で紹介したassignsメソッドを使ってください。このメソッドを使うと、投稿に成功した後にcreateアクション内のマイクロポストにアクセスするようになります。

```ruby:/test/integration/microposts_interface_test.rb
assert_select 'input[type="file"]'
    # 無効な送信
    assert_no_difference 'Micropost.count' do
      post microposts_path, params: { micropost: { content: "" } }
    end
    assert_select 'div#error_explanation'
    # 有効な送信
    content = "This micropost really ties the room together"
    picture = fixture_file_upload('test/fixtures/rails.png', 'image/png')
    assert_difference 'Micropost.count', 1 do
      post microposts_path, params: { micropost:
                                      { content: content,
                                        picture: picture } }
    end
    assert assigns(:micropost).picture?
```

##13.4.2　演習
1.5MB以上の画像ファイルを送信しようとした場合、どうなりますか?
　省略

2.無効な拡張子のファイルを送信しようとした場合、どうなりますか?
　省略

##13.4.3　演習
1.解像度の高い画像をアップロードし、リサイズされているかどうか確認してみましょう。画像が長方形だった場合、リサイズはうまく行われているでしょうか?
　省略

2.既にリスト 13.63のテストを追加していた場合、この時点でテストスイートを走らせると紛らわしいエラーメッセージが表示されることがあります。このエラーを取り除いてみましょう。ヒント: リスト 13.68にある設定ファイルを修正し、テスト時はCarrierWaveに画像のリサイズをさせないようにしてみましょう。

##13.4.3　演習
1.本番環境で解像度の高い画像をアップロードし、適切にリサイズされているか確認してみましょう。長方形の画像であっても、適切にリサイズされていますか?
　どう頑張ってもエラーに勝てなくてスキップ。
　実装しようとしたらApplication errorになっちゃって。
　しかしなぜか、13.4.4の内容は消したら本番環境で画像アップロード出来るように・・・