---
# System prepended metadata

title: 12th 鐵人賽 Day_15 devise？
tags: [12th 鐵人賽]

---

---
title: 12th 鐵人賽 Day_15 devise？
tags: 12th 鐵人賽
--- 
# 12th 鐵人賽 Day_15 devise？

嗨！各位朋友大家好，打給後，歹嘎吼，胎尬喉，我是阿圓，一樣有請今天的one piece：
![](https://i.imgur.com/GSRp8Pp.jpg)


雖然前幾天跟各位講了 model 關聯性，我想了想，還是忍不住跟大家介紹 devise 這個超好用的 gem !

## gem ?
首先先來說說什麼是 gem ，其實就是套件，用蓋棺的角度來比喻：如果你是魔獸世界的玩家，就是'插件'; 如果你是 Minecraft 的玩家，就是'模組';如果你是
跑跑卡丁車的玩家，那就是加裝的氮氣瓶，或是其他的功能。如果上面你都沒有玩的話，就是「基於遊戲之上，玩家們自己做出來讓遊戲過程更加有趣、方便的功能」。

而對於 Ruby on Rails 工程師來說，這個就叫做 gem，就是他人寫好的，讓開發過程更快速、方便的套件。

## devise ?
而 devise 是一個被引用的次數高達八千萬，GitHub 星星數有兩萬，超級好用的 gem !

為什麼這麼好用，想想我們之前光做一個管理者系統，要做些什麼事嗎？

1. 寫路徑
2. 建立 controller、action
3. 建立model
4. 密碼加密
5. 定義current_admin
.
.
.
很多事情，這還是比較簡單的狀況，若今天這是一個大專案，使用者可能還要收發驗證信啦，設定密碼輸入幾次要被鎖帳號啦．．．，等等等；而你想得到的這些，devise 都幫你做好了！以下就讓我來跟大家介紹吧：


在==github==的內容中清楚的寫著，Devise由下方十個 modules 建成，分別對應了不同的功能：

1. Database Authenticatable: 使用者資料在寫入時會驗證
	1. 所以密碼與信箱變更時，都會收到通知
2. Omniauthable：可支援第三方登入(Omniautable)
	use [OmniAuth] (https://github.com/omniauth/omniauth)
3. Confirmable: 發確認信和並檢查會員是否已經收過確認信
4. Recoverable:可以重新設定使用者的密碼
5. Registerable:當使用者註冊後，可以編輯或刪除他們的帳號
6. Rememberable: 自動登入(記住我功能~)
7. Trackable: 追蹤登入紀錄。
8. Timeoutable:超過時間自動登出
9. Validatable:可設定使用者的信箱與密碼需要經過驗證
10. Lockable: 當使用者登入失敗超過指定次後鎖定帳戶，可以用e-mail或在指定的時間後解鎖


使用方法：
## 安裝
將gem devise安裝好後，在終端機打下下面指令：
```
$ rails generate devise:install
```
若有正常安裝，終端機會看到下面的訊息：
(其實就是告訴你，有些東西要設定！)

用中文翻譯大概是：
1. 請去 `config/environments/development.rb`，設定mailer寄送者的預設路徑(ex: `config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }`)(可更換成自己的網址)
2. 請確定在`config/routes.rb`有設定root_path!
3. 請確定在`app/views/layouts/application.html.erb`，有下面兩行，可以印出通知：
```htmlmixed=
 <p class="notice"><%= notice %></p>
 <p class="alert"><%= alert %></p>
```
4. (非必須)若有需要更改使用者登入、註冊的頁面，請打
` rails g devise:views`


## 建立model
1. 在終端機：
```bash=
$ rails g devise User #user是model的名稱
#跟一般建立model的方式很像：
$ rails g model User 
```

2. 建立migrate後，要去migration裡把想開啟的功能的module取消註解！(若想追蹤登入次數，就要把trackle那一塊解開)


## 設定路徑
在使用者登入、變更密碼、變更信箱後預設轉址到user_root_path，可以去routes裡面做設定更改：
```ruby=
get '/users' => 'users#index', as: :user_root # creates user_root_path

namespace :user do
  root 'users#index' # creates user_root_path
end
```
:::info 
:bulb:  如果沒有設定，會轉到root_path，所以一開始需要設定根目錄的path
:::
也可以在application裡覆寫`after_sign_in_path_for`，`after_sign_out_path_for`這兩個方法，來在轉址的時候做一點事。
可以翻翻[文件](https://bre.is/mXNJzZLk)裡提供的例子
```ruby=
def after_sign_in_path_for(resource)
  stored_location_for(resource) ||
    if resource.is_a?(User) && resource.can_publish?
      publisher_url
    else
      super
    end
end
```
:::success
:bulb: 上面的`store_location_for`，也是Devise做好的方法，[詳細請點我](https://bre.is/rfgKZ9KF)
:::


明天來說說 devise 提供的好用 helper，感謝各位看到這邊，若有任何建議，請各位不吝指教！我們明天見！
![](https://i.imgur.com/PPbpd2b.gif)

---
#### 參考文件
[GitHub](https://github.com/heartcombo/devise/tree/f26e05c20079c9acded3c0ee16da0df435a28997)
[devise 手冊](https://www.rubydoc.info/github/heartcombo/devise/master/Devise/Models/DatabaseAuthenticatable)
