使用 devise 加入驗證功能

Created by Piotr Steininger, @polishprince

Updated by Ernesto Jimenez, @ernesto_jimenez

Translation by JuanitoFatas, @JuanitoFatas

Updated by Tony Jian, @tonytonyjan

本指南假設妳已經跟著 打造第一個 APP 指南,寫好了一個 RailsGirls APP

##0.安裝 devise RubyGem

打開專案的 Gemfile,並加入下面這兩行

gem 'devise'
gem 'bcrypt'

並在終端機裡輸入

bundle install

這樣子 devise gem 就安裝完成了。 記得要重新啟動 Rails 伺服器哦

##1.安裝 devise 到 Rails APP

在終端機裡輸入下面的命令:

rails generate devise:install

##2.設定 Devise

devise 需要設定一組密鑰,先用 rake secret 來產生一組密鑰,將產生的內容貼至 config/initializers/devise.rb 的這一行(去掉 # 號)。

# config.secret_key = 'o34f89756234d52fddf79983d95483cf78343a5390c79e1cd5fa897711d89b612b0d293908e681a428650e1bdf5c5dd8d82effb3737d6918b3f9473ee5adf41d0'

改成

config.secret_key = '填入 rake secret 產生的內容'

接著需要設定 mailer 預設的網址選項,打開 config/environments/development.rb ,在檔案最後面找到 end 關鍵字,並在 end 上面加入這行:

config.action_mailer.default_url_options = { host: 'localhost:3000' }

打開 app/views/layouts/application.html.erb,找到 <%= yield %>,並在上面加入這段程式碼:

<% if notice %>
  <p class="alert alert-success"><%= notice %></p>
<% end %>
<% if alert %>
  <p class="alert alert-danger"><%= alert %></p>
<% end %>

最後,如果妳預計要部署到 Heroku,打開 config/application.rb,在檔案最後找到兩個 end 關鍵字,並在上面加入:

config.assets.initialize_on_precompile = false

##3.設定 User Model

使用 devise 的 generator 來建立出 User Model:

rails generate devise user
rake db:migrate

教練: 解釋產生了什麼 Model,產生了什麼欄位?

##4.建立第一個使用者

現在建立第一個使用者的細節都設定完畢了。devise 幫妳產生了建立帳號、登入、登出所需的程式碼與路徑。

重新啟動 Rails 伺服器(CTRL-C + rails s),打開 http://localhost:3000/users/sign_up 來建立妳的帳號吧。

##5.加入註冊與登入連結

現在只需要加入適當的連結到選單右上角,提示使用者已登入的訊息。

編輯 app/views/layouts/application.html.erb,在這段的後面

<ul class="nav">
  <li class="active"><a href="/ideas">Ideas</a></li>
</ul>

加入

<p class="navbar-text pull-right">
<% if user_signed_in? %>
  Logged in as <strong><%= current_user.email %></strong>.
  <%= link_to 'Edit profile', edit_user_registration_path, :class => 'navbar-link' %> |
  <%= link_to "Logout", destroy_user_session_path, method: :delete, :class => 'navbar-link'  %>
<% else %>
  <%= link_to "Sign up", new_user_registration_path, :class => 'navbar-link'  %> |
  <%= link_to "Login", new_user_session_path, :class => 'navbar-link'  %>
<% end %>
</p>

最後,讓使用者必須要登入,不然就跳到登入頁面。打開 app/controllers/application_controller.rb,在這行程式碼後面:protect_from_forgery with: :exception,新增這一行:

  before_action :authenticate_user!

打開妳的瀏覽器,試著登入登出看看。

教練: 講解 user_signed_in? 以及 current_user 這兩個幫助方法 (helper)。 為什麼這兩個方法很有用?

下一步?