現在我們已經有了po文的CRUD功能,
不過如果隨便一個阿貓阿狗來都可以改變po文,或者是無法追蹤使用者的話,
那這樣就變得一點意義都沒有啦!
我們可以用手刻出user的功能來,
不過在動手做東西之前記得先google一下有沒有人已經幫你做了類似的事情了。
記得嗎?
這時候就會找到devise這個gem了,
實作使用者機制會變成一件再輕鬆不過的事情。
(不過記得多去閱讀它的document,不要把方便當隨便了)
很多地方可以點進去wiki看,會發現許多客製化的功能已經有人幫你先做好了,
這時候我們需要的只是去閱讀文件,使用它,打完收工!
第一步還是一樣先在Gemfile裡面加入devise
gem "devise"
rails generate devise:install
照著readme裡面做
會看到一大篇guide告訴你一些config的事情,看完如果沒要更改就可以繼續進行下一步,記得在application.html.erb加入flash messages,待會測試的時候才會知道自己到底登入了沒有
<% if notice %>
rails generate devise user
: 這裡不一定要用user,可以用任何你喜歡的單字,像是:member
再來magic就發生了,稍微看一下terminal上devise幫我們做了哪些事情
打開migrate看一看他新建的user table裡面有哪些欄位,會發現有些還沒有用到的他也幫我們先加好了,不過這裡要加上t.string :name
,因為devise預設不會幫我們生這個欄位
沒問題就bundle exec rake db:migrate
再來執行rake routes看一下,多出了這一大串東西
➜ united_issues git:(devise) ✗ be rake routes
Prefix Verb URI Pattern Controller#Action
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
user_registration POST /users(.:format) devise/registrations#create
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
PATCH /users(.:format) devise/registrations#update
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
再來就直接在application.html.erb加上登入和註冊的連結吧!
(所有頁面共通的東西可以放在這裡。)
記得登出是delete method,如果沒有session的概念可以先這樣記著就好
<nav>
<%= link_to "註冊", new_user_registration_path %>
<%= link_to "登入", new_user_session_path %>
<%= link_to "登出", destroy_user_session_path, method: :delete %>
</nav>
我們希望登入後才能看到登出這個連結,這裡devise也幫我們準備好helper method來做這件事情。
<nav>
<% unless user_signed_in? %>
<%= link_to "註冊", new_user_registration_path %>
<%= link_to "登入", new_user_session_path %>
<% end %>
<% if user_signed_in? %>
<%= link_to "登出", destroy_user_session_path, method: :delete %>
<% end %>
</nav>
也許之後還會有更聰明的方法來解決,不過我們可以先把這支nav bar抽出來做成partial
再來是剛剛新增過的name欄位,我們得在registration/new.html.erb裡面加上去,
要客製化view的話得先執行rails generate devise:views
這裡也可以用rails generate devise:views user,不過這樣的話就要重調controller,
會比較麻煩一點,不過有人覺得這樣比較好看
一樣見仁見智,我是懶惰的人
加上去之後,還要做討人厭的strong parameter,
這裡不一定要將registration controller給弄出來,
devise一樣提供我們懶人的做法,就是在application controller裡面加入:
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :name
end
接著在對一些post controller做小小的限制,讓沒登入的user不能夠編輯、新增、刪除
before_action :authenticate_user!, only: [:edit, :update, :new, :destroy]
參考資料:https://github.com/plataformatec/devise
這些神奇的helper其實都在devise裡面寫好了,
看一下readme會省下很多工。
現在我們已經有了使用者和po文功能,
明天將會使用bootstrap對現在的外觀做一些調整再繼續。