iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Software Development

Rails 開發,每日一套件介紹! 系列 第 18

Day 18: 集會員系統之大成 - Devise

  • 分享至 

  • xImage
  •  

Hello, 我是 Weber,一位工程師,斜槓鼓手與行銷顧問。
今天是每日一套件的第 18 天,繼續跟著我一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!

Day 18: Devise

這是非常經典的會員系統套件,講到會員系統開發,幾乎都會有人提到他,而且功能齊全,文件豐富。
為什麼我一直到第 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 跟 view
rails 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 我會再寫一篇之外,其他功能如果有興趣的話,請留言告訴我,我再補充吧。
我們明天見!


上一篇
Day 17: 淺談隱藏在 Rails 中的美洲獅 - PUMA
下一篇
Day 19 : 座標地圖智慧王 - Geocoder
系列文
Rails 開發,每日一套件介紹! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言