自作アプリ　作成　AccountActivationsリソース

```
ubuntu:~/environment/my_app (account-activation) $ rails generate controller AccountActivations
Running via Spring preloader in process 7329
      create  app/controllers/account_activations_controller.rb
      invoke  erb
      create    app/views/account_activations
      invoke  test_unit
      create    test/controllers/account_activations_controller_test.rb
      invoke  helper
      create    app/helpers/account_activations_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/account_activations.scss
```

###config/routes.rb
```config/routes.rb
Rails.application.routes.draw do
  get 'sessions/new'
  root 'static_pages#home'
  get  '/signup',  to: 'users#new'
  # signupのurlを入力してuser/newのアクションが動き、htmlが表示される。
  get    '/login',   to: 'sessions#new'
  # newアクション
  post   '/login',   to: 'sessions#create'
  # creteアクション
  delete '/logout',  to: 'sessions#destroy'
  # destroyアクション
  resources :users
  # ユーザー情報を表示するURL（/users/1）を追加するためだけのものではありません
  # ユーザーのURLを生成するための多数の名前付きルートと共に、
  #   アクションが利用できるようになるのです
  resources :account_activations, only: [:edit]
  # resources(リソース名.., ブロック引数)
    # リソースベースのルーティング
    # リソースベースのルーティング (以下リソースルーティング) を使うことで、リソースベースで構成されたコントロ 
      # ーラに対応する共通のルーティングを手軽に宣言できます。 
    # resourcesを宣言するだけで、コントローラのindex、show、new、edit、create、update、destroyアク 
      # ションを個別に宣言しなくても1行で宣言が完了します。
end
```
```
ubuntu:~/environment/my_app (account-activation) $ rails generate migration add_activation_to_users \
> activation_digest:string activated:boolean activated_at:datetime
Running via Spring preloader in process 8610
      invoke  active_record
      create    db/migrate/20220117051850_add_activation_to_users.rb
```
###db/migrate/20220117051850_add_activation_to_users.rb
```db/migrate/20220117051850_add_activation_to_users.rb
class AddActivationToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :activation_digest, :string
    add_column :users, :activated, :boolean, default: false
    add_column :users, :activated_at, :datetime
  end
end
```

```
rails db:migrate
```

```
ubuntu:~/environment/my_app (account-activation) $ rails db:migrate
== 20220117051850 AddActivationToUsers: migrating =============================
-- add_column(:users, :activation_digest, :string)
   -> 0.0063s
-- add_column(:users, :activated, :boolean)
   -> 0.0020s
-- add_column(:users, :activated_at, :datetime)
   -> 0.0009s
== 20220117051850 AddActivationToUsers: migrated (0.0111s) ====================
```
userモデルの属性を追加する

###app/models/user.rb
```app/models/user.rb
class User < ApplicationRecord
  attr_accessor :remember_token, :activation_token
  # attr_accessorメソッドは、以下のように文字列かシンボルで読み取りたいインスタンス変数名を指定します。
  # :remember_tokenはシンボル
  before_save   :downcase_email
  # 保存する前にdowncase_emailメソッドを行う
  before_create :create_activation_digest  
  # 新しくサインインする前にcreate_activation_digestメソッドを行う
  validates :name,  presence: true, length: { maximum: 50 }
  # 名前、存在性、長さ（最低50文字）を検証する
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  # 正規表現
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false } 
  # メアド、存在性、長さ（最長２５５文字）、フォーマット（何かしら）、一位性（小文字、大文字関係無く）
  has_secure_password
  # BCryptパスワードを設定して認証するためのメソッド
  validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
  # 存在性が有効、長さ（最小6文字）
  # allow_nil: true 対象の値がnilの場合にバリデーションをスキップ
  def User.digest(string)
  # 渡された文字列のハッシュ値を返す
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end
  
  # ランダムなトークンを返す
  def User.new_token
    SecureRandom.urlsafe_base64
  end
  
  # 永続セッションのためにユーザーをデータベースに記憶する
  def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end
  
  # 渡されたトークンがダイジェストと一致したらtrueを返す
  def authenticated?(remember_token)
    return false if remember_digest.nil?
    BCrypt::Password.new(remember_digest).is_password?(remember_token)
  end
  
  # ユーザーのログイン情報を破棄する
  def forget
    update_attribute(:remember_digest, nil)
  end
end

  private

    # メールアドレスをすべて小文字にする
    def downcase_email
      self.email = email.downcase
      # メアドを小文字化
    end

    # 有効化トークンとダイジェストを作成および代入する
    def create_activation_digest
      self.activation_token  = User.new_token
      # 新しくトークンを生成
      self.activation_digest = User.digest(activation_token)
      # ダイジェストを生成
    end
```
###db/seeds.rb
```db/seeds.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)
end

```
###test/fixtures/users.yml
```test/fixtures/users.yml
michael:
# テストデータ
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>
  admin: true
  activated: true
  activated_at: <%= Time.zone.now %>
  
archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>
  
lana:
  name: Lana Kane
  email: hands@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

malory:
  name: Malory Archer
  email: boss@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

<% 30.times do |n| %>
user_<%= n %>:
  name:  <%= "User #{n}" %>
  email: <%= "user-#{n}@example.com" %>
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>
<% end %>
```