ruby-on-rails
2013-05-15 1 views 2 likes 
2

그래서 간단한 사용자 모델과 암호를 업데이트하는 양식이 있습니다.Rails는 개체를 업데이트하는 동안 고유성을 확인합니까? - 매우 이상한

@user.update_attributes(:password=>params[:password]) 

하지만이 작동하지 않았다, 나는 알아 냈 : 3으로

User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."auth_token" = 'z7KU4I0IXLjiRMpdF6SOVQ' LIMIT 1 
    User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."password_reset_token" = 'aMOjTN0ikPUOJo2JMVoDtQ' LIMIT 1 
    (0.0ms) BEGIN 
    User Exists (1.0ms) SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 1) LIMIT 1 
    (0.0ms) ROLLBACK 
Redirected to http://localhost:3000/edit_user_by_reset?reset_token=aMOjTN0ikPUOJo2JMVoDtQ 

내가 여기 고유성 유효성 검사가 실패 것을 말할 수있는 선택! 그리고 그것이 롤백 (ROLLBACK)의 이유입니다. 하지만 DB에 이러한 행이있는 것은 당연한데, UPDATE 동작이기 때문입니다. 어떻게해야합니까? 나는 패스를 :validate=>false 여기에서 원하지 않는다.

+0

이메일 주소가 동일한 사용자가 두 명 이상 있습니다. 하나는 id = 1이고 다른 하나는 그렇지 않습니다. –

+0

질문을 다시 읽기, 그것은 UPDATE 동작이기 때문에 기존 사용자의 일부 열을 업데이트하는 등의 사용자가 있음을 분명히 알 수 있습니다. –

+2

나는 User.find (1) .valid? 거짓을 반환합니다. 당신이 "명백한"것이라고 생각하는 것은 부정확합니다. 쿼리는 동일한 이메일을 가진 * 다른 * 사용자 (즉, 다른 ID를 가진 사용자)를 찾고 있습니다. –

답변

2

비밀번호 필드 만 업데이트하려면 mass_assignment 메소드 update_attributes을 사용하면 안되며 update_attribute(:password, params[:user][:password])을 사용해야합니다.

params[:password] 해시와 가능한 오류가 있습니다 : 당신이 form_for @user를 사용하는 경우 다음 params[:user][:password]을 가지고 다른 분야에 대한 일반적인 params[:user]에해야한다.

사용자가 유효한지 확인하십시오 (유효성 검사없이 DB에 저장 했습니까?).

2

전에 update_attributes으로 전화를 걸 었는지 확인하십시오.

@user.valid? 

오랜 시간 동안 비슷한 문제를 디버깅하려고했지만 내 데이터가 처음부터 좋지 않다는 것을 알았습니다. 그것은 update_attributes과 아무 관련이 없습니다. 범인 DB 항목을 수정 한 후 @user.find(id)update_attributes을 예상대로 작동시킨 후 모델이 다시 유효하게되었습니다.

관련 문제