iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

Ruby on Rails 新手的30個問題!系列 第 15

Day_15 devise?

嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,一樣有請今天的one piece:

雖然前幾天跟各位講了 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: 使用者資料在寫入時會驗證(所以密碼與信箱變更時,都會收到通知)
  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,有下面兩行,可以印出通知:
 <p class="notice"><%= notice %></p>
 <p class="alert"><%= alert %></p>
  1. (非必須)若有需要更改使用者登入、註冊的頁面,請打
    rails g devise:views

建立model

  1. 在終端機:
$ rails g devise User #user是model的名稱
#跟一般建立model的方式很像:
$ rails g model User 
  1. 建立migrate後,要去migration裡把想開啟的功能的module取消註解!(若想追蹤登入次數,就要把trackle那一塊解開)

設定路徑

在使用者登入、變更密碼、變更信箱後預設轉址到user_root_path,可以去routes裡面做設定更改:

get '/users' => 'users#index', as: :user_root # creates user_root_path

namespace :user do
  root 'users#index' # creates user_root_path
end

§§§ 如果沒有設定,會轉到root_path,所以一開始需要設定根目錄的path §§§


也可以在application裡覆寫after_sign_in_path_forafter_sign_out_path_for這兩個方法,來在轉址的時候做一點事。
可以翻翻文件裡提供的例子

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

§§§§ 上面的store_location_for,也是Devise做好的方法,詳細請點我?§§§§


明天來說說 devise 提供的好用 helper,感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見!

參考文件

GitHub
devise 手冊


上一篇
Day_14 model 關聯性 多對多? & 部落格分類系統
下一篇
Day_16 devise strong_parameters & controller? (2)
系列文
Ruby on Rails 新手的30個問題!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言