日別アーカイブ: 2021年11月28日

Rails tutorialのまとめ(第11章アカウントの有効化 主に演習)

その10から続く

第11章アカウントの有効化

アカウントを有効化する段取りは、ユーザーログイン、
特にユーザーの記憶と似ています。基本的な手順は次のようになります。

1:ユーザーの初期状態は「有効化されていない」(unactivated) にしておく。

2:ユーザー登録が行われたときに、有効化トークンと、
それに対応する有効化ダイジェストを生成する。

3:有効化ダイジェストはデータベースに保存しておき、有効化トークンは
メールアドレスと一緒に、ユーザーに送信する有効化用メールのリンクに仕込んでおく

4:ユーザーがメールのリンクをクリックしたら、アプリケーションはメールアドレス
をキーにしてユーザーを探し、データベース内に保存しておいた
有効化ダイジェストと比較することでトークンを認証する。

5:ユーザーを認証できたら、ユーザーのステータスを「有効化されていない」から
「有効化済み」(activated) に変更する。

今回実装するアカウント有効化やパスワード再設定の仕組みと、
以前に実装したパスワードや記憶トークンの仕組みにはよく似た点が多いので、
多くのアイデアを使い回すことができます。
(具体的にはUser.digestやUser.new_token、改造版のuser.authenticated?メソッドなど)。
それぞれの仕組みの似ている点をまとめてみました

検索キー  string              digest         authentication
email   password         password_digest   authenticate(password)
id      remember_token   remember_digest   authenticated?(:remember, token)
email   activation_token activation_digest authenticated?(:activation, token)
email   reset_token      reset_digest      authenticated?(:reset, token)

11.1 AccountActivationsリソース

ユーザーからのGETリクエストを受けるために、(本来であればupdateのところを)editアクションに変更して使っていきます。

11.1.1 AccountActivationsコントローラ

AccountActivationsリソースを作るために、
まずはAccountActivationsコントローラを生成してみましょう。

rails generate controller AccountActivations

有効化のメールには次のURLを含めることになります。

edit_account_activation_url(activation_token, ...)

editアクションへの名前付きルートが必要になるということです。そこでまずは、名前付きルートを扱えるようにするため、ルーティングにアカウント有効化用のresources行を追加します。

アカウント有効化に使うリソース (editアクション) を追加する
config/routes.rb

Rails.application.routes.draw do
  root   'static_pages#home'
  get    '/help',    to: 'static_pages#help'
  get    '/about',   to: 'static_pages#about'
  get    '/contact', to: 'static_pages#contact'
  get    '/signup',  to: 'users#new'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users
  resources :account_activations, only: [:edit]
end
HTTPリクエスト Action      名前付きルート                 URL 
GET           edit    edit_account_activation_url(token) /account_activation/<token>/edit

続きを読む