Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Rails Parameters: เข้าถึงและใช้งานอย่างมีประสิทธิภาพ

มาพูดถึง Rails Parameters!

ทำไมถึงมีประโยชน์? Users ส่ง Data ให้ Web App 3 วิธี:

  1. Query Parameter ("example.com/?q=bacon")
  2. Submit Form ("/users/sign_in")
  3. ใน 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 🙂 — ขอบคุณที่อ่านครับ