0%

Ruby on Rails 網站開發 練習 - 005 (Create Action 的建立 & Forbidden Attribute Error)

在new.html.erb檔案使用了form_for的View action helper寫法

  • 但是目前我們的寫法form_for(Candidate.new),表示我們在view這邊有new一個新的物件出來。這邊可以做一些修改,讓view更專心做它平常做的事情。
  • 在MVC的架構中,view算是相對 被動 的角色,負責把東西印出來就好。
  • 應該是要由controller的部分來做這件事

接著進到candidates_controller

把原本在new.html.erb檔案中的Candidate.new搬到candidates_controllernew action中。

回到new.html.erb,將form_for(參數)改成@candidate

此時打開瀏覽器,每個欄位輸入資料,按下送出按鈕,會發現好像畫面卡住不會動。


但其實如果看終端機log紀錄,應該會看到log顯示我們對candidates這個路徑使用POST方法,傳送一包parameters給它。並寫到沒有找到對應CandidateController#create的樣板。

此時,我們回到CandidatesController裡面的createaction,寫入一個debugger。


雖然這時候瀏覽器畫面還是呈現轉圈圈,但是終端機是有畫面的,會有一個byebug的輸入區塊

此時可以輸入params看看會得到什麼結果。得到一大串的東西,雖然裡面有token,但是token就交給 Rails 處理。


我們真正感興趣的是"candidate"


那我們就接著輸入params[:candidate]看看會出現什麼吧。
咦?好像有類似hash的東西唷。先暫時把它當作一個hash看待


我們想要取得當中的名字,那我們就繼續輸入params[:candidate][:name]試試看。確實有拿到我們要的名字"bbb"


此時我們可以把剛剛在CandidatesController createaction裡面的debugger改成@candidate = Candidate.new(params[:candidate])


接著我們可以要這個新產生出來的物件去”存檔”。就會有存檔成功及存檔失敗的狀態,所以這邊我們使用if...else的方式去判斷不同情況,分別要做什麼動作。


存檔成功


先來看看瀏覽器畫面。竟然出現之前沒有看過的錯誤訊息


Forbidden Attribute Error

  • 看到「Forbidden Attribute Error」訊息,表示我們透過 model 要將整包 Hash 資料放到資料庫的時候,需要先經過「清洗」。
  • Model 怕資料裡面會被加料一些奇奇怪怪的東西進去。
  • 如果資料沒有經過「清洗」,Model 預設是會資料檔下來。

(舉個例子,有點像是你不洗澡,父母不准你上床睡覺。)
(嗯,雖然這個例子滿爛的,但意思很像。)
此時會充滿疑惑?不是已經檢視頁面原始碼有使用token來保護了嗎?為什麼還要把資料「清洗」過才能存到資料庫裡面呢?


現在我們打開瀏覽器,進到新增候選人的頁面,右鍵 > 檢查
將politics的<div>標籤複製然後也填入資料,並且更改裡面的值為Vote

發現左半邊我們的網頁真的出現剛剛新增的欄位了,我們一樣按下送出按鈕。
接著打開終端機,竟然會看到這樣的畫面

我們透過 POST 的方式,要把一包parameters傳送到資料庫,赫然看到了剛剛我們透過瀏覽器右鍵 > 檢查自己手動新增的 票數欄位 竟然也傳進來了。

表示我們新增這個候選人時,他就天生自帶1000張票數!!!

可以達成灌票數的原因,在於瀏覽器那邊這包資料有合法的 token。就這樣直接寫入資料庫的話,似乎不太對吧。


這就是為什麼資料經由 model 寫入資料庫前,需要確認是否有經過「清洗」。

  • 確保寫入資料庫的資料沒有「被加料」。
  • 同時維持寫入資料庫的資料不會過於龐大,進而消耗資料庫的資源。

下一堂課程,將學習到如何做資料清洗。

參考來源:為你自己學 Ruby on Rails (https://railsbook.tw/)