読者です 読者をやめる 読者になる 読者になる

悪あがきプログラマー

悪あがきを続けていきたい技術と書評なブログです。トレタでiOSエンジニアやってます。

DeviseでSign up時にメール確認する

前回の続いてメール確認を実装します。

前回のエントリー
Railsアプリにユーザー認証を!Deviseを使ってみる - 悪あがきプログラマー

今回はAdminモデルを作ります

MBP13:wakuwakunavi yoonchul$ rails g devise Admin
      invoke  active_record
      create    db/migrate/20120229143303_devise_create_admins.rb
      create    app/models/admin.rb
      invoke    test_unit
      create      test/unit/admin_test.rb
      create      test/fixtures/admins.yml
      insert    app/models/admin.rb
       route  devise_for :admins

メール確認を有効にするために、生成されたmigrationファイルの下記部分をコメントアウトします

25       ## Confirmable
26       t.string   :confirmation_token                               
27       t.datetime :confirmed_at
28       t.datetime :confirmation_sent_at
29       t.string   :unconfirmed_email # Only if using reconfirmable

またモデルに:confirmableを追加します

class Admin < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable                      
      
  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end   

今回は確認用にmanageというコントローラを作ります

MBP13:wakuwakunavi yoonchul$ rails g controller manage index
      create  app/controllers/manage_controller.rb
       route  get "manage/index"
      invoke  erb
      create    app/views/manage
      create    app/views/manage/index.html.erb
      invoke  test_unit
      create    test/functional/manage_controller_test.rb
      invoke  helper
      create    app/helpers/manage_helper.rb
      invoke    test_unit
      create      test/unit/helpers/manage_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/manage.js.coffee
      invoke    scss
      create      app/assets/stylesheets/manage.css.scss

before filterを追加します

class ManageController < ApplicationController
  before_filter :authenticate_admin!           
  def index
  end
end      

これでhttp://0.0.0.0:3000/manage/indexにアクセスすると、
http://0.0.0.0:3000/admins/sign_inにリダイレクトされました
f:id:y_koh:20120301000112p:plain

ここでSign upすると確認メールが送信されます
と言ってもメールサーバーは立ってないし、
メール送信自体の設定はしていないのでログに出てくるだけです

この状態ではまだログインできません

Sent mail to xxxxxxxxxxx@gmail.com (104ms)
Date: Thu, 01 Mar 2012 21:53:02 +0900
From: please-change-me-at-config-initializers-devise@example.com
Reply-To: please-change-me-at-config-initializers-devise@example.com
To: xxxxxxxxxxxxx@gmail.com
Message-ID: <4f4f712ec76d7_38673fe11b015c481966c@MBP13.local.mail>
Subject: Confirmation instructions
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

<p>Welcome xxxxxxxxxxxx@gmail.com!</p>

<p>You can confirm your account email through the link below:</p>

<p><a href="http://localhost:3000/admins/confirmation?confirmation_token=1J77Qy3VTopr3iXo9AkT">Confirm my account</a></p>

一番下のConfirm my accountのリンク先にアクセスするとメール確認が完了し、
ログインできます
f:id:y_koh:20120301220035p:plain

ちなみにもう一度同じ確認URLにアクセスすると、、
f:id:y_koh:20120301220138p:plain

ちゃんとはじかれてます

いやぁ便利ですね!