สำหรับการกำหนดค่าจำนวนมากให้กับโมเดล ActiveRecord โดยไม่บันทึกให้ใช้วิธีassign_attributes
หรือ attributes=
วิธีการเหล่านี้มีอยู่ใน Rails 3 และใหม่กว่า อย่างไรก็ตามมีความแตกต่างเล็กน้อยและ gotchas ที่เกี่ยวข้องกับเวอร์ชันที่ต้องระวัง
ทั้งสองวิธีปฏิบัติตามการใช้งานนี้:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
โปรดทราบว่าไม่มีวิธีใดที่จะทำการตรวจสอบหรือดำเนินการเรียกกลับ การเรียกกลับและการตรวจสอบจะเกิดขึ้นเมื่อsave
มีการโทร
ราง 3
attributes=
แตกต่างจากassign_attributes
ใน Rails เล็กน้อย3 attributes=
จะตรวจสอบว่าข้อโต้แย้งที่ส่งผ่านไปนั้นคือแฮชและส่งกลับทันทีถ้าไม่ใช่ assign_attributes
ไม่มีการตรวจสอบแฮช ดูเอกสาร API ActiveRecord attributes=
การกำหนดแอตทริบิวต์สำหรับ
รหัสที่ไม่ถูกต้องต่อไปนี้จะล้มเหลวโดยไม่ส่งคืนโดยไม่ต้องตั้งค่าแอตทริบิวต์:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
จะทำงานอย่างเงียบ ๆ ราวกับว่าได้รับมอบหมายสำเร็จเมื่อพวกเขาไม่ได้ทำ
รหัสที่ไม่ถูกต้องนี้จะเพิ่มข้อยกเว้นเมื่อassign_attributes
พยายามทำให้สตริงแฮชคีย์ของอาร์เรย์ล้อมรอบ:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
จะเพิ่มNoMethodError
ข้อยกเว้นสำหรับการstringify_keys
ระบุว่าอาร์กิวเมนต์แรกไม่ใช่แฮช ข้อยกเว้นนั้นไม่ได้ให้ข้อมูลมากนักเกี่ยวกับสาเหตุที่แท้จริง แต่ความจริงที่ว่าข้อยกเว้นนั้นเกิดขึ้นเป็นอย่างมากความสำคัญ
ความแตกต่างเพียงอย่างเดียวระหว่างกรณีเหล่านี้คือวิธีที่ใช้สำหรับการมอบหมายจำนวนมาก: attributes=
ประสบความสำเร็จอย่างเงียบ ๆ และassign_attributes
ยกข้อยกเว้นเพื่อแจ้งว่ามีข้อผิดพลาดเกิดขึ้น
ตัวอย่างเหล่านี้อาจดูเหมือน contrived และพวกเขามีในระดับหนึ่ง แต่ประเภทของข้อผิดพลาดนี้สามารถเกิดขึ้นได้เมื่อมีการแปลงข้อมูลจาก API หรือแม้กระทั่งเพียงแค่ใช้ชุดของการแปลงข้อมูลและลืมที่จะผลการสุดท้ายHash[]
.map
รักษารหัส 50 บรรทัดด้านบนและ 3 ฟังก์ชันออกจากการกำหนดคุณสมบัติของคุณและคุณมีสูตรสำหรับความล้มเหลว
บทเรียนที่มีทางรถไฟ 3 คือ: เสมอใช้แทนassign_attributes
attributes=
ราง 4
ในรางที่ 4 เป็นเพียงนามแฝงที่จะattributes=
assign_attributes
ดูเอกสาร API ActiveRecord attributes=
การกำหนดแอตทริบิวต์สำหรับ
ด้วย Rails 4 วิธีใดวิธีหนึ่งอาจถูกใช้แทนกันได้ ความล้มเหลวในการส่งแฮชเป็นอาร์กิวเมนต์แรกจะทำให้เกิดข้อยกเว้นที่มีประโยชน์มาก:ArgumentError: When assigning attributes, you must pass a hash as an argument.
การตรวจสอบ
หากคุณกำลังเตรียมการบินล่วงหน้าเพื่อเตรียม a save
คุณอาจสนใจตรวจสอบก่อนบันทึกเช่นกัน คุณสามารถใช้valid?
และinvalid?
วิธีการนี้ ทั้งสองคืนค่าบูลีน valid?
ผลตอบแทนจริงถ้ารุ่นที่ไม่ได้บันทึกผ่านการตรวจสอบทั้งหมดหรือเท็จถ้ามันไม่ได้ invalid?
เป็นเพียงสิ่งที่ตรงกันข้ามvalid?
valid?
สามารถใช้ดังนี้:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
นี้จะช่วยให้คุณสามารถที่จะจัดการกับปัญหาการตรวจสอบใด ๆ save
ล่วงหน้าของการโทร