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 }
# メアド、存在性、長さ(最長255文字)、フォーマット(何かしら)、一位性(小文字、大文字関係無く)
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 %>