今天想跟大家介紹一下,
之前練習CRUD的流程時,
一直覺得有個東西很神奇,
它就是 Strong Parameters。
當我們今天在設計網頁上讓使用者輸入資料時,
其實就好比打開城門一樣,準備讓外來者進入,
那今天如果你城門都沒有人幫你守門的話,
何時被攻城都不會被感到意外,城門如同虛設完全沒有防禦力啊~
追溯到 Rails4,Strong Paramaters 這個方法才被設計出來,
就是要避免有心人士在填寫資料時,多偷塞了一些參數進去,
也許就可以藉由這個小動作挖出網站上一些不想給外人知道的資訊!
舉例來說,我們偶爾可以看到類似這樣的網址 http://www.tabletennis.com/?butt=1&ten=80
其中 butt
ten
就是Rails中的參數,會長這樣 params[:butt]=1, params[:ten]=80
butt是key, 1是value,這是一對鍵值對,也是所謂的 Hash 資料型態。
今天假設我們要新增一個候選人:
class CandidatesController < ApplicationController
前略
def create
@candidtate = Candidate.new(params[:candidate])
if @candidate.save
redirect_to root_path, notice: "新增成功!"
else
render :new
end
end
其中params[:candidate]裡面就是我們想要新增的資料,
裡面可能有姓名、年紀、學歷、專長等等,
當我們今天直接送出這份資料的時候,
應該會得到以下的錯誤訊息:
我們也能從終端機看到:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"LFzqY+c7W3eL7yJR7VkA5P4gftdRn+c543ZSSFHP3N5tLno+LMOdgeq0V/FbCYzKp+sMddztgkSGYEkFMI+ibw==", "candidate"=>{"name"=>"123", "age"=>"qwew", "party"=>"weqwe", "politics"=>"weee"}, "commit"=>"Create Candidate"}
參數就是這麼一大包,讀起來非常像亂七八糟的東西,
但其實細看的話,會發現裡面有 candidate 的欄位:name, age ,party, politics。
而之所以會得到這個 ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError)
錯誤訊息,其實就是因為我們想要將這一大包的資料一口氣丟進 Model 裡面,就可能會有前面提到資安相關的問題~
我們來看看 Strong Parameters 怎麼為我們把關吧!
class CandidatesController < ApplicationController
前略
private
def candidate_params
params.require(:candidate).permit(:name, :age, :party, :politics)
end
方法的名稱可以任意取,不過最好還是選擇有意義的名稱,將來維護的時候也會比較清楚!
這邊的重點是,我們想要過濾的是 params(:candidate) 這個參數,我們只允許裏頭四個參數通過,
分別是 :name, :age, :party, :politics,其他的一律不接受。
寫好了方法,我們看一下上頭 create 的方法中,
Candidate.new(params[:candidate] => Candidate.new(candidate_params),這樣才能應用上我們定義的方法!
這樣就可以確保新增資料的時候不會發生 ActiveModel::ForbiddenAttributesError 的錯誤訊息了
這是今天想介紹關於 Strong Parameters,希望對你有點幫助。