about 2 years ago

before_action 的使用時機:

  • before_action 是什麼?
    定義在進入Action之前,執行特定的方法,用以減少controller裡面重複的程式碼。
    Rails在run controller下的 action 前要先跑指定的method。

  • 為什麼要用 before_action?
    目的在於簡化程式碼,以利程式碼的可讀性和加快程式執行的速度。

  • 如何使用 before_action?
    在controller裡面,所有方法定義Methods之前使用。

    before_action :authenticate_user! only: [:edit]
    

    程式碼在執行methods之前會先執行身份驗證的機制,可以利用only,except此兩個關鍵字來限定哪些Action要執行,上述程式碼僅有edit所定義的方法才會執行身份驗證。

session 與 cookie 的差別:

  • 什麼是 session 跟 cookie?

看演唱會或是去遊樂園玩常常會發生一種情況,就是入場以後要暫時出場,這時候工作人員通常會給你蓋個手章,用來註記你曾經入場過,基本上 Cookies 的功用就是這個手章,只要使用者進到我們的網站,我們就幫他儲存一個 Cookies ,下次當使用者再度造訪時我們就可以由 Cookies 得知使用者的資訊。有些遊樂園的手章上會標記當天的入園時間,以免有人回家不洗澡隔天又來玩一次,而 cookies 記錄這個時間的方法就是以 key/value 的形式儲存在使用者的瀏覽器中,但 Cookies 屬於沒有加密的公開檔案,所以不建議儲存敏感資料。

相較於 Cookies 存在 Client 端, Session 則是存在 Server 的資料,通常與 Cookies 相呼應。當使用者造訪我們的網站時,我們由伺服器產生 session id (32 byte long MD5 hash value),並傳送存有這個 session id 的 cookie 給瀏覽器儲存,之後使用者造訪我們網站時,只需要比對 cookies 上的 session id 和 session 裡的 session id 就可以知道使用者身份,大部份的網站也是運用此原理實作儲存 User 登入狀態的機制。這樣做的好處是若有人劫取到使用者的 Cookies 資料也無法得知資料內容,但是仍有 Hijacking 攻擊的疑慮。

  • 為什麼要用 session 跟 cookie?
    用來儲存資料的手段,常用來作為使用者是否登入的方法。

  • Rails 內如何操作 session?
    在 Rails 內只要用 session[:session_name]的 instance method 就可以取得 session 的特定資料了。
    若要新增或是覆蓋現有的 session 資料,只要用session[:session_name] = YYY就可以了
    若要刪除特定的 session 值,只要下session_delete(:session_name)

狀態機:

  • 什麼是狀態機?
    可以透過aasm狀態機去做物件狀態的切換,在EC網站下就是去管理及切換已下單,已付款,已出貨,出貨中,退貨,取消訂單等狀態。

  • 為什麼要使用狀態機去設計訂單狀態?
    避免手動操作狀態而使狀態混亂,在設定好的規則下讓狀態機來做狀態的管理及切換。

  • 如何在 Rails 內設計狀態機機制?(以Ec-shop網站為例)

    1. 安裝 gem "aasm"
    2. order 新增 aasm_state 欄位
    3. 設定訂單狀態機制
    4. 用 AASM 的機制設定訂單付款

如何讓 strong_parameter 接受 nested_attributes:

step 1:在Model中,宣告我們可以接受的Attributes。 (model:Photo.rb,Product.rb)
step 2:在Controller中,指定接受的Attributes。 (products_controller.rb)

board has_many posts, 新造物件宣告方式是: @post = @boards.posts.build 。那如果 book has_one :author,請問要怎麼宣告?

@author=@book.build.author

after_create 是一種 model callbacks, 請問 model 有多少種 call backs 請列出來

  1. before_validation
  2. before_create
  3. before_save
  4. after_validation
  5. after_create
  6. after_save
  7. after_commit

(in controller ) render 與 redirect_to 的差異:

render: 不執行action,不改變url的狀態下,直接套用某一個view。
redirect_to:會執行指定頁面的controller action,直接轉址到某個url。

← Rails即戰力課程第三週筆記 Rails即戰力課程第四週筆記 →