มาพูดถึงพารามิเตอร์ Rails กันเถอะ!
ทำไมจึงมีประโยชน์
ผู้ใช้สามารถส่งข้อมูลไปยังเว็บแอปพลิเคชันของคุณได้สามวิธี
สามวิธีนี้คือ :
- การใช้พารามิเตอร์การค้นหา (
"example.com/?q=bacon"
) - การส่งแบบฟอร์ม (
"/users/sign_in"
) - ภายใน URL เอง (
"/books/1"
)
คุณเข้าถึงข้อมูลนี้จาก Rails ได้อย่างไร
ด้วย params
.
ภายในการกระทำของผู้ควบคุม คุณสามารถเรียก params
เพื่อ เข้าถึงแบบฟอร์ม &ข้อมูลการสืบค้น URL .
params
. คืออะไร ใช่ไหม
เป็นวิธีการที่ส่งคืน ActionController::Parameters
วัตถุ ในทางปฏิบัติมันมีลักษณะเหมือนแฮชมาก
ตอนนี้
สมมติว่าคุณต้องการอ่านค่าหนึ่งค่าจาก params
. นี้ แฮช.
ตามนี้ :
params[:id]
คุณจะได้รับค่าหากมีอยู่
หรือ nil
หากไม่เป็นเช่นนั้น
ข้อควรรู้เล็กน้อย :
- ถ้าเว้นช่องว่างไว้ คุณจะได้สตริงว่าง
- ค่าทั้งหมดภายใน
params
เป็นสตริง แม้ว่าจะส่งเป็นจำนวนเต็มแล้ว
มาดูพารามิเตอร์ Rails ให้ลึกกว่านี้หน่อยดีกว่า เพราะถ้าคุณไม่เข้าใจดี อาจทำให้เกิดความสับสนและปัญหาแปลก ๆ ได้!
Rails Conventions:Form Fields &Params
ฟิลด์แบบฟอร์ม &พารามิเตอร์ URL จับคู่กับ params
อย่างไร กุญแจ?
ฉันมีตัวอย่างให้คุณ
ที่นี่ :
นี่คือแบบฟอร์มการค้นหาง่ายๆ ที่จะส่งคำขอ POST ไปที่ /search
.
ด้วยเหตุนี้ คุณจะได้ params
วัตถุ:
{ "q"=>"", "controller"=>"books", "action"=>"search" }
“q” นี้คืออะไร?
เป็น แอตทริบิวต์ชื่อของช่องป้อนข้อมูลในรูปแบบ HTML .
ชื่อจะเป็นอะไรก็ได้ที่คุณต้องการ
หากคุณสร้างแบบฟอร์มโดยใช้ form_for
วิธีช่วยเหลือ ชื่อจะถูกสร้างขึ้นโดยอัตโนมัติสำหรับคุณและเป็นไปตามรูปแบบเฉพาะ
นี่คือตัวอย่าง :
# form_for(@book) with a few fields generates something like this
book[title]
.นี้ รูปแบบในช่องชื่อจะสร้าง params
แฮชที่ค่าจะถูกซ้อนกัน
ให้ฉันอธิบายด้วยตัวอย่าง :
{ "book"=> { "title"=>"", "author"=>"", "cover"=>"", "language"=>"English" } }
ผู้ใช้ส่งแบบฟอร์มเปล่าและนี่คือสิ่งที่คุณได้รับ
จากคอนโทรลเลอร์ของคุณ…
คุณเข้าถึงข้อมูลเช่นนี้ :
params[:book][:language] # "English" params[:book][:author] # ""
โปรดจำไว้ว่าสิ่งนี้ทำงานเหมือนแฮช แต่ต่างจากแฮชทั่วไป โดยจะยอมรับทั้งสัญลักษณ์และสตริงเป็นคีย์ที่เทียบเท่ากัน
แปลว่า params["book"]
¶ms[:book]
เหมือนกัน
การเปิดใช้งานเส้นทางของคุณเพื่อยอมรับพารามิเตอร์
นอกจากพารามิเตอร์การสืบค้นแล้ว คุณยังสามารถเปิดใช้งานพารามิเตอร์รูปแบบ REST ได้อีกด้วย
ใน Rails เราเรียกสิ่งนี้ว่า “ส่วนไดนามิก”
มาดูตัวอย่างกัน
ถ้าคุณมีเส้นทางเช่น :
get 'books/:id', to: 'books#show'
หรือ :
resources :books
คุณจะสามารถใช้ URL แบบนี้ได้ :
/books/1
จากนั้นคุณสามารถเข้าถึง 1
. นี้ ซึ่งเป็น id
ใน books/:id
.
ด้วย params
.
ถูกใจสิ่งนี้ :
params[:id]
ซึ่งจะช่วยคุณค้นหาแหล่งข้อมูลเฉพาะที่ผู้ใช้กำลังมองหา
Book.find(params[:id])
ทำความเข้าใจพารามิเตอร์ที่แข็งแกร่ง
ถัดไป:
หากคุณพยายามบันทึกวัตถุลงในฐานข้อมูลของคุณ แต่ดูเหมือนว่าจะไม่ทำงาน
ดูบันทึกเซิร์ฟเวอร์ Rails ของคุณ
คุณอาจเห็นสิ่งนี้ :
Unpermitted parameter: :language
สิ่งนี้หมายความว่าอย่างไร
Rails เปิดตัวระบบ “พารามิเตอร์ที่แข็งแกร่ง” กลับมาใน Rails 4 เป็นฟีเจอร์ความปลอดภัย
บังคับให้คุณ อนุญาตพิเศษแอตทริบิวต์ ที่สามารถบันทึกได้
ซึ่งป้องกันปัญหาที่เรียกว่า "การกำหนดจำนวนมาก" ซึ่งอนุญาตให้ผู้ใช้ที่เป็นอันตรายตั้งค่า admin = true
หรือตั้งค่าช่องอื่นๆ ที่ปกติจะไม่สามารถเข้าถึงได้
คุณสามารถอนุญาตพิเศษฟิลด์เช่นนี้ :
def book_params params.require(:book).permit(:title, :author, :cover, :language) end
วิธีนี้ทำงานอย่างไร
- The
require
เมธอดจะมองหาparams[:book]
และแจ้งข้อผิดพลาดหากไม่มี - การ
permit
method คือรายการแอตทริบิวต์ที่อนุญาต (แต่ไม่บังคับ)
เป็นผลให้คุณได้รับ params
ใหม่ แฮชกับแอตทริบิวต์เหล่านี้ แต่ตอนนี้ชัดเจนแล้วที่จะบันทึกลงในฐานข้อมูล
ตัวอย่าง :
Book.create(book_params)
ขอให้สังเกตว่าแฮช Ruby ปกติจะข้ามระบบความปลอดภัยนี้
ตัวอย่าง :
Book.create(title: "", author: "", cover: "")
สิ่งนี้น่าจะใช้ได้หากชื่อแอตทริบิวต์ (เช่น author
) เป็นฮาร์ดโค้ด
สรุป
คุณได้เรียนรู้เกี่ยวกับพารามิเตอร์ Rails วิธีทำงาน และวิธีการใช้อย่างถูกต้องในโครงการ Rails ของคุณ!
ตอนนี้ถึงตาคุณที่จะฝึกฝน จดบันทึก ทบทวน 🙂
ขอบคุณสำหรับการอ่าน