【Railsチュートリアル】第7章 ユーザー登録④

# 7.4 ユーザー登録成功
* 新規ユーザーを実際にデータベースに保存できるようにして、ユーザー登録フォームを完成させる。

## 7.4.1 登録フォームの完成
ユーザー登録に成功した場合はページを描画せずに別のページにリダイレクト（Redirect）するように作成する。

```ruby:user_controller.rb
(前略)
  def create
    @user = User.new(user_params)
    if @user.save
      #redirect_to user_url(@user)と同じ
      redirect_to @user
    else
      render 'new'
    end
  end
(後略)
```

###演習 1
有効な情報を送信し、ユーザーが実際に作成されたことを、Railsコンソールを使って確認してみましょう。

確認のみなので省略。

###演習 2
リスト 7.26を更新し、redirect_to user_url(@user)とredirect_to @userが同じ結果になることを確認してみましょう。

確認のみなので省略

##7.4.2 flash
**flash**の実装

* 登録完了後に表示されるページにメッセージを表示（新規ユーザーへのウェルカムメッセージ）
* 2度目以降にはそのページにメッセージを表示しないようにする

```
flash[:success] = "Welcome to the Sample App!"
```
上のコードは、最終的には次のようなHTMLになる。

```
<div class="alert alert-success">Welcome to the Sample App!</div>
```

###演習 1
コンソールに移り、文字列内の式展開（4.2.1）でシンボルを呼び出してみましょう。例えば"#{:success}"といったコードを実行すると、どんな値が返ってきますか? 確認してみてください。

```console
>> "#{:success}"
=> "success"
```

###演習 2
先ほどの演習で試した結果を参考に、リスト 7.28のflashはどのような結果になるか考えてみてください。

```リスト7.28
$ rails console
>> flash = { success: "It worked!", danger: "It failed." }
=> {:success=>"It worked!", danger: "It failed."}
>> flash.each do |key, value|
?>   puts "#{key}"
?>   puts "#{value}"
>> end
success
It worked!
danger
It failed.
```

```
>> "#{flash [:success]}"
=> "It worked!"
```

##7.4.3 実際のユーザー登録
###演習 1
Railsコンソールを使って、新しいユーザーが本当に作成されたのかもう一度チェックしてみましょう。結果は、リスト 7.30のようになるはずです。

```
>> User.find_by(email: "example@railstutorial.org")
   (3.1ms)  SELECT sqlite_version(*)
  User Load (2.5ms)  SELECT "users".* FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "example@railstutorial.org"], ["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2021-02-13 18:10:29", updated_at: "2021-02-13 18:10:29", password_digest: [FILTERED]>
```

###演習 2
自分のメールアドレスでユーザー登録を試してみましょう。既にGravatarに登録している場合、適切な画像が表示されているか確認してみてください。

確認だけなので省略。

##7.4.4 成功時のテスト
* データベースの中身が正しいかどうか検証する（有効な情報を送信して、ユーザーが作成されたことを確認する）

```ruby:test/integration/users_signup_test.rb

# signupの情報が有効かテストせよ
test "valid signup information" do
  # signup_pathにgetリクエスト
  get signup_path
  #
  assert_difference 'User.count', 1 do
    post users_path, params: { user: { name:  "Example User", email: "user@example.com", password: "password", password_confirmation: "password" } }　# User情報を渡す
  end
  follow_redirect!
  assert_template 'users/show'
  end
end
```

###演習 1
7.4.2で実装したflashに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.32に最小限のテンプレートを用意しておいたので、参考にしてください（FILL_INの部分を適切なコードに置き換えると完成します）。ちなみに、テキストに対するテストは壊れやすいです。文量の少ないflashのキーであっても、それは同じです。筆者の場合、flashが空でないかをテストするだけの場合が多いです。

```
assert_not flash.empty?
```

###演習 2
本文中でも指摘しましたが、flash用のHTML（リスト 7.29）は読みにくいです。より読みやすくしたリスト 7.33のコードに変更してみましょう。変更が終わったらテストスイートを実行し、正常に動作することを確認してください。なお、このコードでは、Railsのcontent_tagというヘルパーを使っています。

確認のみなので省略。

###演習 3
リスト 7.26のリダイレクトの行をコメントアウトすると、テストが失敗することを確認してみましょう。

```
ERROR["test_valid_signup_information", #<Minitest::Reporters::Suite:0x000055860cc7db60 @name="UsersSignupTest">, 7.415014998001425]
 test_valid_signup_information#UsersSignupTest (7.42s)
RuntimeError:         RuntimeError: not a redirect! 204 No Content
            test/integration/users_signup_test.rb:20:in `block in <class:UsersSignupTest>'
```
**RuntimeError**
プログラムの実行時（プログラムを動かしているとき）に発生するエラー。
リダイレクトが無いと言われている。

###演習 4
リスト 7.26で、@user.saveの部分をfalseに置き換えたとしましょう（バグを埋め込んでしまったと仮定してください）。このとき、assert_differenceのテストではどのようにしてこのバグを検知するでしょうか? テストコードを追って考えてみてください。

```
 FAIL["test_valid_signup_information", #<Minitest::Reporters::Suite:0x00007f0389d137b8 @name="UsersSignupTest">, 8.838942277001479]
 test_valid_signup_information#UsersSignupTest (8.84s)
        "User.count" didn't change by 1.
        Expected: 1
          Actual: 0
        test/integration/users_signup_test.rb:17:in `block in <class:UsersSignupTest>'
```

（翻訳）
`test_valid_signup_information`でエラーが起こっています。
`User.count`は1つも変化しませんでした。
期待値「1」
実　績「0」

`assert_difference`は実行前後で`User.count`が＋1になっていないといけない。
`@user.save`がでいない＝`user`が＋1されない＝エラー

#7.5 プロのデプロイ
##7.5.4 本番環境へのデプロイ
###演習 1
ブラウザから本番環境（Heroku）にアクセスし、SSLの鍵マークがかかっているか、URLがhttpsになっているかどうかを確認してみましょう。

確認のみなので省略。

###演習 2
本番環境でユーザーを作成してみましょう。Gravatarの画像は正しく表示されているでしょうか?

確認のみなので省略。

#さいごに
ながい、ながいぞ。
第8章では認証システム、第9章ではユーザーのログイン・ログアウトを実装するということで、いよいよ動的ページという感じがしてきました。
どれもWebアプリ作成のときは必須項目だと思うので、はりきって