Rails에서 유효성 검사 오류 외에 .save ()가 실패한 원인을 어떻게 알 수 있습니까?


91

나는 반환되는 액티브 모델이 true에서 valid?(그리고 .errors가 비어을), 그러나 반환 false에서 save(). 모델 인스턴스가 유효한 경우 저장 실패의 원인을 어떻게 알 수 있습니까?


7
몇 주 전에이 문제가 발생했습니다. 일부 리팩토링은 항상 false를 반환하는 before_save 함수를 남겨 두었 기 때문에 저장이 실패했습니다.
Jeff Paquette 2011 년

1
@Jeff-감사합니다. : before_save 메소드가 false를 반환하는 것으로 밝혀졌습니다. 너 어떻게 찾아 냈니? 코드 검사였습니까?
kdt

코드 검사 였고 버전 관리와 비교했습니다.
Jeff Paquette 2011 년

답변:


48

모든 콜백을 확인하십시오.

나는 내가 가지고 있던 이와 같은 문제가 있었고 모델을 많이 변경 한 후 실패한 "after_validate"메소드가있었습니다. 모델은 유효했지만 "after_validate"는 false를 반환하고 있었기 때문에 사용 model.valid하면 true라고 말했지만 저장하면 유효성 검사 오류가 발생했습니다 (after_validate 콜백에서 전달됨). 이상 했어요.

응용 프로그램 추적을 살펴보면 예외를 발생시키는 코드 줄을 볼 수 있습니다.


2
Jeff의 의견에 따르면 문제는 false를 반환하는 before_save 콜백으로 밝혀졌습니다.
kdt

3
@kdt-정확히 내 문제였습니다. before_save는 속성을 설정하기위한 것이기 때문에 생각하지 않았습니다.하지만 false 값으로 설정했기 때문에 암시 적으로 반환되고 저장이 자동으로 실패하게되었습니다. 밝은면에서 이제는 줄을 추가하여이 코드를 수정할 수있는 옵션이 있습니다 "Hey! That's MY fake leg!" # Believe it or not, this is important. 내가 그렇게 할 것이 아닙니다. ;)
Nathan Long

2
진정한 반환 값을 보장하는 좋은 방법은 다음과 같습니다true.tap { do_something }
Nathan Long

와, 모호한 문제입니다. false를 반환하는 콜백이 저장을 멈출 것이라고 추측하지 못했을 것입니다. 누군가가 이것에 대한 문서를 가리킬 수 있습니까? 지적 해 주셔서 감사합니다!
andy 2013 년


116

뱅 버전 save!(끝에 느낌표가 있음)을 사용하고 결과 오류를 검사 해보십시오 .


4
저장! RecordNotSaved를 던지고 있습니다 (예외의 .message를 인쇄 할 때 예외 클래스의 이름을 얻습니다). 더 자세한 정보를 찾아야 할 곳이 있습니까?
kdt

1
Rails 개발 모드에있는 경우 스택 추적과 함께 오류에 대한 전체 설명을 인쇄해야합니다. 단서를 찾아 보거나 여기에 게시하세요.
Andy Lindeman 2011 년

1
콘솔을 사용하고 객체를로드 한 다음 (예 : o = Object.find #id) o.save! 대답이 말하는 것처럼. 저장하지 않는 이유를 인쇄합니다.
pduey

1
참고로, 호출 save!ActiveRecord::RecordInvalid(유효성 검사를 실행하기 때문에) 발생 시킬 수 ActiveRecord::RecordNotSaved있으므로 구출하고 싶은 것입니다.
Dennis

2
이것은 .save검증으로 인한 것이 아닌 실패 를 진단하는 방법에 대한 근본적인 질문에 대한 가장 불만족스러운 대답이기 때문 입니다. "최소 만족스럽지 않은"자격은이 답변이 아닌 Rails를 가리 킵니다.
Chuck Batson

111

경우 @user.save반환 (예를 들어) false, 다음 그냥이 모든 오류를 얻을 실행

@user.errors.full_messages

13
질문에서 언급했듯이 .valid? true입니다. 즉, 유효성 검사 오류가 없습니다. .errors가 빈 목록도 반환하는지 확인했습니다 (문제를 지적하도록 업데이트했습니다)
kdt

3

예, 모든 before_ * 콜백에서 true를 반환했는지 확인 하여이 문제를 해결 한 다음 작동을 시작합니다. :)


-1

내가 가진 문제는 모델에 유효성 검사를 추가하는 것을 잊었다는 것입니다.

class ContactGroup < ActiveRecord::Base
  validates_presence_of :name
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.