ในรางฉันจะทราบได้อย่างไรว่าอะไรทำให้ a .save () ล้มเหลวนอกเหนือจากข้อผิดพลาดในการตรวจสอบความถูกต้อง


93

ฉันมีโมเดล ActiveRecord ซึ่งส่งคืนtrueจากvalid?(และ. error ว่างเปล่า) แต่กำลังกลับมาfalseจากsave()ไฟล์. หากอินสแตนซ์โมเดลถูกต้องฉันจะทราบได้อย่างไรว่าอะไรทำให้การบันทึกล้มเหลว


7
ฉันมีปัญหานี้เมื่อสองสามสัปดาห์ก่อน การปรับโครงสร้างบางอย่างทิ้งฟังก์ชัน before_save ที่ส่งคืนค่าเท็จตลอดเวลาซึ่งทำให้การบันทึกล้มเหลว
Jeff Paquette

1
@ เจฟฟ์ - ขอบคุณปรากฎว่ามีเมธอด before_save ที่ส่งคืนเท็จ คุณรู้ได้อย่างไร? มันเป็นเพียงการตรวจสอบรหัสหรือไม่?
kdt

มันเป็นการตรวจสอบโค้ดและการทำต่างจากการควบคุมเวอร์ชัน
Jeff Paquette

คำตอบ:


49

ตรวจสอบการโทรกลับทั้งหมดของคุณ

ฉันมีปัญหาเช่นนี้ที่ฉันมีและเมธอด "after_validate" ที่ล้มเหลวหลังจากที่ฉันได้ทำการเปลี่ยนแปลงหลายอย่างกับโมเดล แบบจำลองถูกต้อง แต่ "after_validate" ส่งคืนเป็นเท็จดังนั้นหากฉันใช้model.validมันบอกว่าจริง แต่ถ้าฉันบันทึกไว้ก็ทำให้ฉันมีข้อผิดพลาดในการตรวจสอบความถูกต้อง (ส่งผ่านจากการเรียกกลับ after_validate) มันแปลกมาก

ดูที่การติดตามแอปพลิเคชันและคุณควรจะเห็นว่าบรรทัดของรหัสใดที่เพิ่มข้อยกเว้น


2
ตามความคิดเห็นของเจฟฟ์ปัญหากลับกลายเป็นการโทรกลับ before_save ที่ส่งคืนเท็จ
kdt

3
@kdt - นั่นคือปัญหาของฉัน ฉันไม่ได้คิดเกี่ยวกับเรื่องนี้เพราะ before_save มีไว้เพื่อตั้งค่าคุณสมบัติ แต่เนื่องจากตั้งค่าเป็นค่าเท็จจึงถูกส่งกลับโดยปริยายและนั่นทำให้การบันทึกล้มเหลวโดยไม่ได้ตั้งใจ "Hey! That's MY fake leg!" # Believe it or not, this is importantด้านสว่างตอนนี้ผมมีตัวเลือกในการแก้ไขรหัสนี้โดยการเพิ่มบรรทัด ไม่ใช่ว่าฉันจะทำอย่างนั้น ;)
Nathan Long

2
วิธีที่ดีในการรับประกันว่าจะได้รับมูลค่าที่แท้จริงคือtrue.tap { do_something }
Nathan Long

ว้าวช่างเป็นปัญหาที่คลุมเครือ จะไม่มีทางเดาได้ว่าการเรียกกลับที่ส่งคืนเท็จจะหยุดการบันทึก มีใครช่วยชี้ฉันไปที่เอกสารนี้ได้ไหม ขอบคุณที่ชี้ให้เห็น!
andy


117

ลองใช้เวอร์ชันปังsave!(มีเครื่องหมายอัศเจรีย์ต่อท้าย) และตรวจสอบข้อผิดพลาดที่เกิดขึ้น


4
ประหยัด! เป็นเพียงการโยน RecordNotSaved (เมื่อฉันพิมพ์ .message ของข้อยกเว้นฉันเพิ่งได้รับชื่อของคลาสข้อยกเว้น) มีที่ไหนที่ฉันควรหารายละเอียดเพิ่มเติม
kdt

1
หากคุณอยู่ในโหมดการพัฒนา Rails ควรพิมพ์คำอธิบายแบบเต็มของข้อผิดพลาดพร้อมกับ stack trace ดูเบาะแสและ / หรือโพสต์ที่นี่
Andy Lindeman

1
ฉันใช้คอนโซลโหลดวัตถุ (เช่น o = Object.find #id) จากนั้นทำ o.save! เหมือนที่คำตอบบอก มันพิมพ์ออกมาว่าทำไมไม่บันทึก
pduey

1
FYI การโทรsave!สามารถเพิ่มActiveRecord::RecordInvalid(เนื่องจากมีการตรวจสอบความถูกต้อง) หรือActiveRecord::RecordNotSavedนั่นคือสิ่งที่คุณต้องการช่วยเหลือ
Dennis

2
+1 เนื่องจากนี่เป็นคำตอบที่ไม่น่าพอใจน้อยที่สุดสำหรับคำถามพื้นฐานเกี่ยวกับวิธีวินิจฉัย.saveความล้มเหลวที่ไม่ได้เกิดจากการตรวจสอบความถูกต้อง คุณสมบัติ "ไม่น่าพอใจน้อยที่สุด" หมายถึง Rails ไม่ใช่คำตอบนี้
Chuck Batson

115

หาก@user.save(เช่น) ส่งคืนให้falseเรียกใช้สิ่งนี้เพื่อรับข้อผิดพลาดทั้งหมด:

@user.errors.full_messages

13
ดังที่ฉันได้กล่าวไว้ในคำถาม. ถูกต้องหรือไม่? เป็นจริง - กล่าวคือไม่มีข้อผิดพลาดในการตรวจสอบความถูกต้อง ฉันได้ตรวจสอบแล้วว่า. error กำลังส่งคืนรายการที่ว่างเปล่าเช่นกัน (ฉันได้อัปเดตคำถามเพื่อชี้ประเด็นนั้น)
kdt

3

ใช่ฉันแก้ไขปัญหานี้โดยตรวจสอบให้แน่ใจว่าฉันคืนค่าจริงในการโทรกลับ before_ * ทั้งหมดของฉันแล้วมันจะเริ่มทำงาน :)


-2

ปัญหาที่ฉันพบคือฉันลืมเพิ่มการตรวจสอบความถูกต้องให้กับโมเดล

class ContactGroup < ActiveRecord::Base
  validates_presence_of :name
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.