Railsチュートリアル 第11章 アカウントの有効化 - 演習 - authenticated?メソッドの抽象化

## 1. コンソール内で新しいユーザーを作成してみてください。新しいユーザーの記憶トークンと有効化トークンはどのような値になっているでしょうか? また、各トークンに対応するダイジェストの値はどうなっているでしょうか?

```
# rails console --sandbox

>> user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, password_digest: nil, remember_digest: nil, admin: false, activation_digest: nil, activated: false, activated_at: nil>
```

この時点では全ての属性が`nil`か`false`ですね。これでは`authenticated?`メソッドが実行できません。有効な属性を与えていきましょう。

```
>> name = Faker::Name.name
=> "Alayna Hudson"
>> email = "example-00@railstutorial.org"
=> "example-00@railstutorial.org"
>> password = "password"
=> "password"
>> User.create!( name:                  name,
?> email:                 email,
?> password:              password,
?> password_confirmation: password,
?> )
...略
=> #<User id: 103, name: "Alayna Hudson", email: "example-00@railstutorial.org", created_at: "2019-12-07 13:35:32", updated_at: "2019-12-07 13:35:32", password_digest: "$2a$10$1kYvhTz6MR/F9bekfJHmaewVSkCYxSrnG7EpRUkqiaV...", remember_digest: nil, admin: false, activation_digest: "$2a$10$L3A798aHfZ9Z5l8IkZ03Re0wdzo8eP227clGfD.k5L7...", activated: false, activated_at: nil>

>> user = User.find_by(email: "example-00@railstutorial.org")
...略
=> #<User id: 103, name: "Alayna Hudson", email: "example-00@railstutorial.org", created_at: "2019-12-07 13:35:32", updated_at: "2019-12-07 13:35:32", password_digest: "$2a$10$1kYvhTz6MR/F9bekfJHmaewVSkCYxSrnG7EpRUkqiaV...", remember_digest: nil, admin: false, activation_digest: "$2a$10$L3A798aHfZ9Z5l8IkZ03Re0wdzo8eP227clGfD.k5L7...", activated: false, activated_at: nil>
```

有効なユーザー情報が得られました。

この時点では、`remember_token`ならびに`activation_token`は`nil`です。

```
>> user.remember_token
=> nil

>> user.activation_token   
=> nil
```

# 発展1. コンソールから、有効な`remember_token`と`remember_digest`の組を取得してみましょう。

続いて、有効な`remember_token`と`remember_digest`の組を生成していきます。

```
>> user.remember
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.2ms)  UPDATE "users" SET "updated_at" = ?, "remember_digest" = ? WHERE "users"."id" = ?  [["updated_at", "2019-12-07 13:47:33.270269"], ["remember_digest", "$2a$10$vffDzd.WhIA1Pqr253/x8essHdEoHO8y6UYioEW3OGSr7uAcGfMcS"], ["id", 103]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true

```

# 発展2. コンソールから、有効な`activation_token`と`activation_digest`の組を取得してみましょう。

```
>> user.activation_token = User.new_token
=> "8wuF8jduRAEQmojrqyBX0w"
>> user.update_attribute(:activation_digest, User.digest(user.activation_token)) 
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.2ms)  UPDATE "users" SET "updated_at" = ?, "activation_digest" = ? WHERE "users"."id" = ?  [["updated_at", "2019-12-08 02:57:37.023207"], ["activation_digest", "$2a$10$hjQAsSsaf9z8N.uIex4VwOPv9jC53HFConZKuKkVxXjlrm2CaErBe"], ["id", 103]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true
```

# 2. [リスト 11.26](https://railstutorial.jp/chapters/account_activation?version=5.1#code-generalized_authenticated_p)で抽象化した`authenticated?`メソッドを使って、先ほどの各トークン/ダイジェストの組み合わせで認証が成功することを確認してみましょう。

発展1.および発展2.の続きです。

```
>> user.authenticated?(:remember, user.remember_token)
=> true

>> user.authenticated?(:activation, user.activation_token)
=> true
```