iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
1
自我挑戰組

Ruby菜鳥村村民遊記系列 第 14

遊記ep.14 守護者見參!Strong Parameters in Rails村

  • 分享至 

  • xImage
  •  

今天想跟大家介紹一下,
之前練習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]裡面就是我們想要新增的資料,
裡面可能有姓名、年紀、學歷、專長等等,
當我們今天直接送出這份資料的時候,
應該會得到以下的錯誤訊息:
https://ithelp.ithome.com.tw/upload/images/20190929/20120907Ls148mx1je.png

我們也能從終端機看到:

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,希望對你有點幫助。


上一篇
遊記ep.13 關聯性的Rails村-3
下一篇
遊記ep.15 Validates in Rails村
系列文
Ruby菜鳥村村民遊記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言