iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
1
自我挑戰組

關於 Ruby on Rails 的那些事系列 第 25

Day 25 - Devise 會員系統 - 客製化

  • 分享至 

  • xImage
  •  

相信看到這邊的你已經知道這個套件有很多可以自定義或客製化的部份。接下來的是 view 和 controller 的客製化了!

自定義 views

由於 devise 是個引擎,它把所有相關的 view 都打包在 gem 之中。這些 view 雖然協助開發者能夠更快速的建立,但總是會想有自己的味道,那要怎麼做呢?
靠這個指令把 view 從 gem 複製出來

$ rails g devise:views

如果在專案中有超過 1 個的 Devise model(例如:User 和 Admin),要注意一點的是這些 model 的 views 都是使用相同的 views。Devise 當然也有提供一個簡單的方法去客製化自己的 views,只需要在 config/initializers/devise.rb 中設定 config.scoped_views = true
接下來,可以根據角色不同,提供不同的 views。
例如:users/sessions/new、admins/sessions/new
如果在 scope 找不到 views,devise 預設會去找 devise/sessions/new 的 view。或者自己下指令長一個

$ rails g devise:views users

如果不想要每個畫面都長一個新的,只有部分畫面需要客製化,假設 registerable 和 confirmable 這兩個模組要新的就好

$ rails g devise:views -v registrations confirmations

自定義 Controllers

可以改 views,想必也會想要改 controller 吧~跟著文件 4 步驟:

1. 建立 controller

$ rails g devise:controllers [scope]

後面的 scope 我是用 users,結果如下:

一次會長出所有相關的 controllers,這些檔案會在 app/controller/users/ 目錄底下。另有提示訊息提醒要確認在 routes.rb 中設定正確路徑,我們打開他範例中的 session controller 看看

接下來就是設定 routes 囉!

小補充:如果不想一次長出一堆 controllers ,可以用另一個指令
$ rails generate devise:controllers [scope] -c=[controller's name]

這邊我用 admins 作為 scope,建立 sessions controller,指令和結果如下:

rails generate devise:controllers admins -c=sessions 

2. 設定 route

告訴 router 去使用剛剛定義的 controller

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

3. views 搬移

因為自定義 controller 與原先不同了,故無法使用預設的 devise/sessions 的 view,要把views 搬家,從 devise/sessions 複製 views 到 users/sessions。

4. 最後,修改或擴充想要的 controller action

原有的 aciton 都是直接引用複層的 class

# app/controllers/users/session_controller.rb
class Users::SessionsController < Devise::SessionsController
  def create
    super
  end
end

你可以完全覆寫原有的 action

# app/controllers/users/session_controller.rb
class Users::SessionsController < Devise::SessionsController
  def create
    # custom sign-in code
  end
end

或者加一些簡單的行為

# app/controllers/users/session_controller.rb
class Users::SessionsController < Devise::SessionsController
  def create
    super do |resource|
      BackgroundWorker.trigger(resource)
    end
  end
end

自定義 route

Devise 有提供預設的路徑,如果想要客製化也可以,透過 devise_for 方法,還有幾個選項可以選擇。要更改路徑名稱也可以,不過可能需要根據 i18n,這邊就不多說了。

devise_for :users, path: "auth", path_names: { 
  sign_in: 'login',
  sign_out: 'logout',
  password: 'secret',
  confirmation: 'verification',
  unlock: 'unblock',
  registration: 'register',
  sign_up: 'cmon_let_me_in'
 }

還有更多的 devise_for 細節可以參考這裡
參考資料:
Devise 快速上手
Devise - GitHub

學無止盡,每天都要進步一點點!


上一篇
Day 24 - Devise 會員系統 - 貳
下一篇
Day 26 - 上傳檔案 Carrierwave - 單一檔案
系列文
關於 Ruby on Rails 的那些事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言