devise confirmable 會員註冊認證信

安裝devise

step1

在gmefile加入devise。

gemfile.rb
gem `devise`

step2

install devise

command line
rails generate devise:install

step3

install letter_opener_web
安裝letter_opener_web,用來在本機直接預覽mail
gem 'letter_opener_web'
bundle install

修改config/environments/development.rb

development.rb
  config.action_mailer.default_url_options = { host: 'localhost:3000'}
  config.action_mailer.delivery_method = :letter_opener_web

修改routes

routes.rb
if Rails.env.development?
     mount LetterOpenerWeb::Engine, at: "/letter_opener"
   end

http://localhost:3000/letter_opener
可以看到letter_opener的管理介面

step4

建立 user model

command line
rails generate devise MODEL
#rails generate devise user

step5

在User model的devise裡加入:confirmable

user.rb
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:

  # :confirmable, :lockable, :timeoutable and :omniauthable

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable ,:confirmable
    end

step6

在建立User model時,會在db/migrate裡自動建立一個migration檔,打開然後把檔案裡的Confirmable的註解打開。

20160416114105_devise_create_users_devise_create_user.rb
## Confirmable

      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

      
      add_index :users, :confirmation_token,   unique: true

如果已經做了db:migrate的話就再開一個migration來做
rails g migration add_confirmable_to_user

add_confirmable_to_user.rb
add_column :users , :confirmation_token , :string
add_column :users , :confirmed_at , :datetime
add_column :users , :confirmation_sent_at , :datetime
add_column :users , :unconfirmed_email , :string
add_index :users , :confirmation_token,   unique: true

執行rake db:migrate

做到這步驟在註冊使用者之後應該就會收到註冊信了,開http://localhost:3000/letter_opener就可以看到收到的信件。

devise流程控制

如果點了註冊信連結之後要去control之後的流程,就要去新增devise controller去控制流程。

step1

generate devise contollers
原本devise的controllers都是隱藏起來的,所以要把這些controllers建立出來
rails g devise:controllers users
devise:controllers後面的參數是指要把建立出來controller放在app/controllers裡的哪個資料夾,這邊就是把建立出來的controller放在app/controllers/users資料夾裡

step2

點了註冊信的連結之後會跑到confirmations_controller裡的after_confirmation_path_for method,所以要override這個method,在這個method裡加入登入功能。

controllers/users/confirmations_controller.rb
  def after_confirmation_path_for(resource_name, resource)
    sign_in(resource)#使用者登入

    super(resource_name, resource)
  end

step3

設定 routes

routes.rb
  devise_for :users, controllers: {
    sessions: "users/sessions" ,
    confirmations: "users/confirmations"
  }

修改mailer view

step1

把devise的view建立出來
rails generate devise:views users
修改confirmation_instructions.html.erb,客製化mailer view

修改mailer headers

step1

建立mailer
rails generate mailer UserMailer
編輯UserMailer
要更改mailer headers 要先讓UserMailer繼承Devise::Mailer,然後override confirmation_instructionsmethod,然後在裡面設定要更改的參數

user_mailer.rb
class UserMailer < Devise::Mailer
  def confirmation_instructions(record, token, opts={})
    headers["Custom-header"] = "Bar"
    opts[:subject] = 'my_custom_from@domain.com'
    opts[:from] = 'my_custom_from@domain.com'
    opts[:reply_to] = 'my_custom_from@domain.com'
    super
  end
end

修改 config/initializers/devise.rb

config/initializers/devise.rb
config.mailer = 'YOUR_MAILER'
#config.mailer = 'UserMailer'

restart rails server

參考資料:
https://5fpro.hackpad.com/ep/pad/static/yqQMWO0OrGO
How To: Add :confirmable to Users
How To: Use custom mailer

comments powered by Disqus