`params.require (: person) .permit (: name,: age)` กำลังทำอะไรอยู่ใน Rails 4?


149

ตัวอย่างทั้งหมดของพารามิเตอร์ที่แข็งแกร่งใน Rails 4 ใช้เอกสาร

params.require(:person).permit(:name, :age)

คนได้โปรดแยกแยะและอธิบายสิ่งที่เกิดขึ้นด้วยrequireและpermitที่นี่?


3
ตัวอย่างนี้มาโดยตรงจากเอกสารซึ่งจะอธิบายแต่ไม่permit require
Erik Trautman

คำตอบ:


202

paramsในตัวควบคุมลักษณะเช่นกัญชา แต่จริง ๆ แล้วมันเป็นตัวอย่างของActionController::Parametersซึ่งมีหลายวิธีเช่นและrequirepermit

requireวิธีการเพื่อให้แน่ใจว่าพารามิเตอร์ที่เฉพาะเจาะจงเป็นปัจจุบันและถ้ามันไม่ได้ให้ที่requireวิธีการโยนข้อผิดพลาด ส่งคืนอินสแตนซ์ของActionController::Parametersสำหรับคีย์ที่ส่งผ่านเข้าrequireมา

permitวิธีการส่งกลับสำเนาของวัตถุพารามิเตอร์กลับเท่านั้นที่ได้รับอนุญาตคีย์และค่า เมื่อสร้างโมเดล ActiveRecord ใหม่เฉพาะแอ็ตทริบิวต์ที่อนุญาตเท่านั้นที่จะถูกส่งผ่านไปยังโมเดล

ดูเหมือนว่ารายการที่อนุญาตที่เคยรวมอยู่ในรุ่น ActiveRecord จะมีลักษณะเหมือนกัน แต่ก็เหมาะสมกว่าที่จะอยู่ในคอนโทรลเลอร์


37
รายละเอียดของใบอนุญาตเป็นบิตออก: ใบอนุญาตส่งกลับกัญชาอื่นที่มีเฉพาะที่ได้รับอนุญาตที่สำคัญและ (นี้เป็นสำคัญ) จะตอบสนองกับtrueกับpermitted?วิธีการ โดยค่าเริ่มต้นอินสแตนซ์ของActionController::Parametersชั้นจะกลับมาfalseสำหรับpermitted?การตอบสนองtrueที่จะpermitted?หมายถึงวัตถุพารามิเตอร์ที่สามารถนำมาใช้ในการกำหนดมวล; มิฉะนั้นแอปจะส่งข้อผิดพลาด ForbiddenAttributes
Sameers

3
การผูกมัดpermitกับrequireอนุญาตและรวมพารามิเตอร์ที่จำเป็นในวัตถุที่ส่งคืนหรือไม่
Dennis

ฉันพบว่าการตั้งชื่อไม่เป็นไปตามที่ต้องการมากกว่าการทำพารามิเตอร์ที่อนุญาต การใช้ params.permit (: person,: name,: age) ไม่ทำงานและสร้างข้อผิดพลาดเช่น "พารามิเตอร์ที่ยังไม่ส่ง:: utf8" สำหรับรูปแบบทั่วไป
ดาเมียน

6

เพื่อความแม่นยำมากขึ้นเมื่อคุณสร้างเช่น การทำ.new(...)จะต้องมี:personแฮชที่ระบุโดยต้องการและแฮชของบุคคลนั้นจะยอมรับ:nameและ:ageระบุโดยการอนุญาตเท่านั้น

ตัวอย่าง:

.new(person: { name: "Bhojendra", age: 32 }) // okay
.new(person: { name: "Rauniyar" }) // okay
.new(person: { name: "Bhojendra", other: 'asdf' }) // not okay, other not permitted
.new(person: { full_name: "Bhojendra Rauniyar" }) // not okay, full_name not permitted
.new(detail: { name: "Bhojendra", age: 32 }) // not okay, must be person

not okayตัวอย่างที่ 3 และ 4 เห็นภาพอะไร
p0k8_

@ p0k8_ ฉันแก้ไขคำตอบเพื่อชี้แจงว่า ตัวอย่างเหล่านั้นแสดงชื่อเขตข้อมูลที่แตกต่างกันซึ่งไม่ได้ "อนุญาต"
แฮร์รี่วู้ด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.