相信看到這邊的你已經知道這個套件有很多可以自定義或客製化的部份。接下來的是 view 和 controller 的客製化了!
由於 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
可以改 views,想必也會想要改 controller 吧~跟著文件 4 步驟:
$ rails g devise:controllers [scope]
後面的 scope 我是用 users,結果如下:
一次會長出所有相關的 controllers,這些檔案會在 app/controller/users/
目錄底下。另有提示訊息提醒要確認在 routes.rb 中設定正確路徑,我們打開他範例中的 session controller 看看
接下來就是設定 routes 囉!
$ rails generate devise:controllers [scope] -c=[controller's name]
這邊我用 admins 作為 scope,建立 sessions controller,指令和結果如下:
rails generate devise:controllers admins -c=sessions
告訴 router 去使用剛剛定義的 controller
# routes.rb
devise_for :users, controllers: { sessions: "users/sessions" }
因為自定義 controller 與原先不同了,故無法使用預設的 devise/sessions 的 view,要把views 搬家,從 devise/sessions 複製 views 到 users/sessions。
原有的 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
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
學無止盡,每天都要進步一點點!