2010-01-04 4 views
3

나는 레일의 일반적인 에러 체크 라인 인 것으로 나타났습니다 :정확하게 저장/저장 하시겠습니까! 해야 할 것?

if @user.save! 

보다는 뭔가 그래서 내 이해

Save 
If Save is successful 
Blah 
Else 
Blah 
End 

처럼 "만약 @ user.save!" 객체를 저장하고 성공하면 true/false를 반환한다는 것입니다. 나중에 전화 할 경우 :

@user.save! 
if @user.save! 
    blah 
end 

저장 쿼리를 두 번 실행합니까?

+0

논리적으로 대답은 "예"이어야하지만 레일즈 전문가가 아닙니다 –

+0

확실하지 않습니다. 객체에서 아무 것도 변경되지 않은 경우 데이터베이스를 두 번째로 저장하지 않아도됩니다. 로그 파일에 무엇이 들어 있는지 확인하십시오 (개발 환경의 logs/development.log) –

답변

7

약간의 차이가 있지만, 그럼에도 불구하고, 나는 중요하다고 인정합니다. 문서가 여기에 꽤 있습니다 :

저장하십시오!

절약형! 유효성 검사는 항상 실행됩니다. ActiveRecord :: RecordInvalid 중 하나라도 실패하면 발생합니다. 저장

(perform_validation = TRUE)

perform_validation의 경우는 true 검증을 실행합니다. 둘 중 하나라도 실패하면 작업이 취소되고 save는 false를 반환합니다. 플래그가 false이면 유효성 검사가 모두 생략됩니다. 자세한 내용은 ActiveRecord :: Validations를 참조하십시오.

이렇게 저장하십시오! 진실 또는 거짓을 반환하는 것이 아니라 성공할 경우에만 진실을 나타내며 실패하면 흥분을 일으킬 것입니다.

이 구별의 목적은 save!를 사용하면 표준 ruby ​​기능을 사용하여 컨트롤러에서 오류를 포착 할 수 있으며 save는 표준 if-clauses를 사용하여 동일하게 수행 할 수 있습니다. 적어도 내가 생각하는 것.

+0

Moritz 감사합니다. 위에서 한 가지 질문은 저의 마지막 저장 예를 사용하고 "if save!"를 사용하면 ... db를 두 번 누르는 것입니까? – Kevin

+0

hm, 내 이해에서, AR과 같은 orm 레이어도 최적화 작업을하고 수정되지 않은 개체를 (다시) 저장하기 위해 데이터베이스에 전송하는 것은 영리하지 않기 때문에 추측 할 수 없습니다 .-) – moritz

관련 문제