มาพูดถึง Rails Parameters!
ทำไมถึงมีประโยชน์? Users ส่ง Data ให้ Web App 3 วิธี:
- Query Parameter (
"example.com/?q=bacon") - Submit Form (
"/users/sign_in") - ใน URL เอง (
"/books/1")
เข้าถึงจาก Rails ยังไง? ด้วย params
ใน Controller Actions เรียก params เข้าถึง Form & URL Query Data
params คืออะไร? Method คืน ActionController::Parameters Object — พฤติกรรมคล้าย Hash
ตอนนี้ อยากอ่าน 1 ค่าจาก params Hash — ทำแบบนี้:
params[:id]
ได้ Value ถ้ามี — หรือ nil ถ้าไม่มี
สิ่งที่ควรรู้:
- Field ว่าง = ได้ Empty String
- ค่าใน
paramsทั้งหมดเป็น Strings — แม้ Submit เป็น Integers
มาดูลึกลงเพราะถ้าไม่ เข้าใจดี จะสับสนและปัญหาแปลกๆ!
Rails Conventions: Form Fields & Params
Form Fields และ URL Parameters Map ไป params Keys ยังไง?
ตัวอย่าง:
Simple Search Form ส่ง POST ไป /search — ได้ params:
{ "q"=>"", "controller"=>"books", "action"=>"search" }
"q" คืออะไร? Name Attribute ของ Input Field ใน HTML Form — Name เป็นอะไรก็ได้
ถ้า用 form_for Helper Names Auto-generate ตาม Pattern
ตัวอย่าง:
# form_for(@book) กับ Fields จะ Generate ประมาณนี้
Format book[title] ใน Field Names จะทำให้ params Hash Nested
อธิบายด้วยตัวอย่าง:
{ "book"=> { "title"=>"", "author"=>"", "cover"=>"", "language"=>"English" } }
User Submit Blank Form ได้นี้ — จาก Controller... เข้าถึงแบบนี้:
params[:book][:language] # "English" params[:book][:author] # ""
จำว่า Behavior เหมือน Hash แตกต่าง: รับ Symbols และ Strings เป็น Keys เหมือนกัน — params["book"] และ params[:book] เหมือนกัน
Enable Routes รับ Parameters
นอกจาก Query Params ยัง Enable REST-style Params ได้ — เรียกว่า "Dynamic Segment"
Route แบบนี้:
get 'books/:id', to: 'books#show'
หรือ: resources :books
URLs แบบนี้ใช้ได้:
/books/1
เข้าถึง 1 (ID ใน books/:id) ด้วย params:
params[:id]
ช่วยหา Resource ที่ User หา — Book.find(params[:id])
เข้าใจ Strong Params
ถ้า Save Object ลง DB แตไม่ได้ — ดู Rails Server Log
อาจเจอ:
Unpermitted parameter: :language
หมายถึงอะไร? Rails Introduced "Strong Parameters" (Rails 4) Security Feature — บังคับ Whitelist Attributes ที่ Save ได้
ป้องกัน "Mass Assignment" — User ร้ายตั้ง admin = true หรือ Fields ที่ไม่ควรเข้าถึง
Whitelist แบบนี้:
def book_params params.require(:book).permit(:title, :author, :cover, :language) end
ทำงานยังไง?
requireหาparams[:book]Error ถ้าไม่มีpermit= List Allowed (Optional) Attributes
ผลลัพธ์: params Hash ใหม่ Attributes เหล่านี้ Clear สำหรับ Save DB
ตัวอย่าง: Book.create(book_params)
สังเกต Regular Ruby Hash Bypass Security System — Book.create(title: "", author: "", cover: "") OK ถ้า Hardcoded
Summary (สรุป)
คุณเรียนรู้ Rails Parameters — ทำงานยังไง ใช้ถูกต้องใน Rails Projects!
ตอนนี้ถึงคุณ Practice, Notes, Review 🙂 — ขอบคุณที่อ่านครับ