Hello, 我是 Weber,一位工程師,斜槓鼓手與行銷顧問。
今天是每日一套件的第 18 天,繼續跟著我一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!
這是非常經典的會員系統套件,講到會員系統開發,幾乎都會有人提到他,而且功能齊全,文件豐富。
為什麼我一直到第 18 天才講呢? 恩~其實也沒為什麼,就是知道這要寫很多字,所以一直拖搞,哈哈哈。
然後通常這也是屬於你要新開一個專案,才會用到的套件。(如果是維護專案,可能會員系統早就寫好了)
Devise 這個套件內含大約 10 個選配 modules:
會員註冊、電子郵件跟密碼驗證、會員登入、會員認證信、忘記密碼、第三方登入、錯誤登入上鎖、上鎖後恢復的解鎖、追蹤會員使用時間、固定時間登出 以及 對密碼進行雜湊處理並將其儲存在資料庫中,以在登入時驗證使用者的真實性。另外還內建多語言i18n,這個日後再講。
基本上,會員系統會用到的功能,都已經包含在內了,確實是一個非常厲害的套件。
幾乎可以是說在安裝完的同時,就等於把會員系統做完了。
不過這個套件困難點不在安裝,困難點在於客製化。因為他原生已經很完整了,但如果要銜接上網站的其他功能,或者對某些功能做一些客製化設定,就要花時間去讀文件了。
另外補充一點心得給未來在五倍開發的朋友,這個套件在專案的前期很重要,如果在前期寫的完整,摸得熟。在中後期比較不會一直在這裡撞牆,畢竟很有可能所有功能都圍繞著會員功能轉。
起手式不多說了。
bundle add devise
接著執行
rails generate devise:install
好到這裡為止,沒什麼問題,後面開始就不能傻傻照著文件打了,要仔細閱讀一下。
接著請你創建一個 model,用一個類似 rails g 的指令rails g devise MODEL
這裡的 MODEL 請換成想要的 Model 名稱,可以是 User、Admin、Member 都可以。
先別急著db:migrate,先看一下產生出來的 migration 跟 user.rb 檔
如果有你想要用的功能,可以先把註解打開,這裡只需要留下你想要用的功能,其他的都可以刪除了。
這裡我也多加了一個 name 的欄位,是日後給會員暱稱用的。
user.rb
class User < ApplicationRecord
#Include default devise modules. Others available are:
#:lockable, :timeoutable, :trackable and
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :confirmable,
:omniauthable, omniauth_providers: %i[google_oauth2]
end
migration
#frozen_string_literal: true
class DeviseCreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
t.string :name
##Database authenticatable
t.string :email, null: false, default: ''
t.string :encrypted_password, null: false, default: ''
##Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
##Rememberable
t.datetime :remember_created_at
##Trackable
#t.integer :sign_in_count, default: 0, null: false
#t.datetime :current_sign_in_at
#t.datetime :last_sign_in_at
#t.string :current_sign_in_ip
#t.string :last_sign_in_ip
##Confirmable
#t.string :confirmation_token
#t.datetime :confirmed_at
#t.datetime :confirmation_sent_at
#t.string :unconfirmed_email # Only if using reconfirmable
##Lockable
#t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
#t.string :unlock_token # Only if unlock strategy is :email or :both
#t.datetime :locked_at
t.timestamps null: false
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
#add_index :users, :confirmation_token, unique: true
#add_index :users, :unlock_token, unique: true
end
end
確定後,db:migrate
Devise 會自動產出幾個方法可以使用,user 不是一定的,是看你 model 名稱是什麼就是什麼。
before_action :authenticate_user!
user_signed_in?
current_user
user_session
接著陸續產生,controller 跟 viewrails g devise:controllers
rails g devise:views
另外,也可以套用 scope 的方式建立rails g devise:controllers [scope]
替換成 user 或任何rails g devise:views [scope]
替換成 user 或任何
會多出一堆檔案,記得沒有用到的view,可以直接刪掉了
或者在產生 view 的時候,用-v的方式篩選,舉例來說:rails generate devise:views -v registrations confirmations
controller 要注意的是,它是class OmniauthCallbacksController < Devise::OmniauthCallbacksController
繼承自 "Devise::功能",有別於我們一般在 rails 中的 controller 繼承 ApplicationController。
最後他的 route 也有獨特的寫法,用 devise_for
以下是我的範例,我有套用 scope 所以我的路徑是 users/xxxx,這個各位見仁見智。
devise_for :users, controllers: {
sessions: 'users/sessions',
registrations: 'users/registrations',
passwords: 'users/passwords',
omniauth_callbacks: 'users/omniauth_callbacks',
confirmations: 'users/confirmations'
}
到這裡為止,算是完成第一步。
以上是基礎的設定,還有很多關於 devise 的設定,位於 config/initializers/devise.rb
內,如果英文不錯的,應該是可以輕鬆調整。
至於客製化,像是 email 認證、認證後轉址、環境設定等,可能需要另外講解了。
如果你英文不錯的,其實文件裡都有,就是大量閱讀吧!
除了 i18n 我會再寫一篇之外,其他功能如果有興趣的話,請留言告訴我,我再補充吧。
我們明天見!