Conclusion

終於把註冊和登入功能做完,實現使用者的驗證功能之後,就可以根據登入狀態和使用者的身份來限制對特定頁面的訪問權。下一節會繼續實作編輯使用者資訊的功能。

現在來合併一下:

$ bundle exec rake test
$ git add -A
$ git commit -m "Finish log in/log out"
$ git checkout master
$ git merge log-in-log-out

然後 push、deploy:

$ bundle exec rake test
$ git push
$ git push heroku
$ heroku run rake db:migrate

注意如果只是 push 到 Heroku 上,APP 並無法實際作用,因此必須執行遷移。在擁有龐大流量的 production 環境中,更新前最好先開啟 maintenance mode 的模式:

$ heroku maintenance:on
$ git push heroku
$ heroku run rake db:migrate
$ heroku maintenance:off

這樣做的話會在部署和執行遷移時產生一個標準的錯誤頁面,詳情請看 Heroku 的文件說明: error pages

學到什麼?

  • Rails 可以使用暫時 cookie 和持久 cookie 維持頁面之間的狀態
  • 登入表單是用來建立一個新的 session,好讓使用者登入
  • flash.now 方法是用來在重新渲染(render)的頁面顯示 flash messages
  • 使用 TDD 可以用來在測試中重現問題
  • session 方法可以讓我們把使用者 ID 安全的存進瀏覽器裡,建立暫時 session
  • 可以根據登入狀態修改功能,例如佈局中顯示的連結
  • 整合測試可以檢查路由、資料庫更新和對佈局的修改
  • 為了實作持久性 session,我們為使用者產生了 remember token 和相對應的 remember digest
  • cookies 方法可以在瀏覽器的 cookie 裡面儲存持久的 remember token,實現持久性 session
  • 登入狀態取決於有沒有目前的使用者,而目前的使用者,可以透過短暫 session 的 user ID 或是持久性 session 中唯一的 remember token 獲得
  • 使用者登出的功能會透過刪除 user ID 和刪除瀏覽器中的持久 cookie 實現
  • 三元運算子可以撰寫簡潔的 if-then 述句