使用 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)。 為什麼這兩個方法很有用?
下一步?
- 加入更多欄位到 User Model
- 加入 Idea 與 User Model 之間的關係
- 限制使用者只能編輯自己的 idea。
- 使用角色或權限來管理(用一個像是 CanCan 這樣流行的授權 gem)