2016-09-19 4 views
0

내 시스템의 사용자는 고유 한 전자 메일이 있어야합니다. 기존 전자 메일을 사용하여 사용자를 만들려고하면 컨트롤러에서 오류가 발생하고 변경 내용을 롤백합니다.유효성 검사 실패 후 업데이트 모델

속임수 전자 메일 시도가있는 경우 모델 레코드를 업데이트하고 싶습니다. 그러나 롤백은 다른 레코드에 있어도 변경 내용을 방지합니다. 나는 update_attribute, update_columnsave(validate: false)을 시도했지만 그 중 아무 것도 작동하지 않습니다.

롤백을 무시하고 (별도의) 모델을 일부 수정하려면 어떻게해야합니까?

+0

언제 업데이트 하시겠습니까? 전자 메일이 필요하거나 고유하지만 고유성이 실패 할 경우 실제로 새 레코드를 만드는 방법을 이미 알 수 없습니다. 하지만 기존 레코드를 업데이트하는 방법을 생각할 수 있습니다. 모델의 오류 개체를 사용하여 전자 메일 유효성 검사가 실패했는지 확인한 다음 별도의 요청으로 모델을 업데이트 할 수 있습니다. 예를 들어 person.errors [: email]를 사용하여 사람의 전자 메일 속성에 대한 오류를 확인하고 해당 사람의 email_error 속성과 같은 업데이트가있는 경우를 확인합니다. –

+0

저장 하시겠습니까 (유효성 검사 : 거짓)? 저장하지 않습니다 (유효성 검사 : 거짓). – YTorii

+0

동일한 요청에서 이상적으로 발생합니다. 나는 기존의 레코드를 편집하고 새로운 레코드를 만들지 않을 것입니다. 롤백은 요청 중에 변경된 내용을 롤백하는 것으로 보입니다. 그러나 나는이 시점에서 어떤 해결책으로도 해결할 것이다. – Dty

답변

1

내 경우에는 after_rollback 트릭을합니다.

after_rollback 콜백 중에 이메일이있는 사용자가 있는지 확인합니다. 그렇다면 롤백은 속임수 전자 메일 유효성 검사 실패로 인한 것으로 가정하고 적절한 레코드를 업데이트하십시오.

+0

이전에 after_rollback 콜백을 보지 못했습니다. 산뜻한. 콜백 내에서'person.errors [: email]'라는 에러 객체를 여전히 사용할 수 있다고 생각합니다. 실제로 일치하는 이메일에 대해 DB를 다시 쿼리하는 대신 실제로 속이는 전자 메일 오류가 있는지 확인합니다. 실질적으로 차이를 만들지는 알 수 없습니다. –

+0

저는 4 년 동안 레일 작업을 해왔고, 처음으로 레일을 보았습니다. 'person.errors'에 대한 좋은 호소, 확실히 더 좋은 생각입니다. 제 경우에는 원본 레코드의 메타 데이터를 업데이트하지만'person.errors'를 확인하는 것이 훨씬 명확합니다. – Dty

0

전자 메일 유효성 검사에 on : : create 옵션을 사용하는 것은 어떻습니까? 이 옵션을 사용하면 유효성 검사는 create에서만 실행되고 update에서는 건너 뜁니다.

validates :email, uniqueness: true, on: :create 
+0

감사하지만 어쩌면 나는 충분히 명확하지 않다. 이건 내 문제를 해결 못해. 유효성 검사 오류가 발생하는 동안 업데이트를 시도하고 변경 사항이 고집하지 않습니다. – Dty