2011-01-19 2 views
0

저는 웹 사이트에서 rails 2.3.5 및 Authlogic을 사용하고 있으며, 중복 된 이메일을 저장하려는 사용자의 hoptoad를 통해 데이터베이스에 오류가 발생했습니다. 문제는 모델에 validates_uniqueness_of :email이 있다는 것입니다.validates_uniqueness_of의 문제점

여기 개발 테스트에서 예상되는 유효성 검사 오류가 발생하고 사용자는 저장되지 않지만 프로덕션 환경에서는 DB 계층에서이 오류가 계속 발생합니다.

대소 문자를 구분하는 이메일을 테스트했으며 올바르게 인증되었습니다.

나는

생산에서 발생 될 수있는 것을 ... 확인하고 클래스와 더 attr_accessor이나 다른 속성을 재정의가 없다, 나는 Authlogic가 잘못된 방법으로 그것을 할 것이라고 생각하지 않는거야? 레일 유효성 검사가 작동하지 않는 경우가 있습니까?

답변

0

시나리오 재 작성을 시도해 보셨습니까? Hoptoad Notification에 오류가있는 이유는 무엇입니까? 내 말은, 기본적으로 사용자가있는 경우 사용자를 저장해서는 안되며 hoptoad에 대한 오류를 표시해서는 안된다는 것입니다.

또한 authlogic에서 전자 메일에 validate_uniqueness_of를 지정해야한다고 생각하지 않습니다. 대개 authlogic이이를 처리합니다.

내가 생각하기에, 당신이 깊은 잠수를 할 시간.

로그를보고이 오류를 로컬에서 다시 시도하십시오. 항상 오류로 이어지는 단계를 되돌아 보는 것이 가장 좋습니다.

세부 정보, 오류 스택, 코드가 도움이 될 것입니다.

+0

예, 이메일이 이미 존재하는 경우 hoptoad 오류가 발생하지 않아야 알고있다. 단순히 '이 이메일은 이미 사용 중입니다.'라는 메시지와 함께 양식을 검증하고 다시 방문해야합니다.이 동작은 거의 모든 경우에 발생하지만 레일스가 이미 존재하는 전자 메일의 유효성을 검사하는 경우가 거의 없으므로 사용자를 저장하려고 시도하고 UNIQUE 인덱스로 인해 데이터베이스에서 오류가 발생합니다. 나는 그것을 다시 만들려고 노력하고 있지만 동일한 데이터를 사용하더라도 오류 대신 올바른 동작을 얻습니다./ – Draiken

0

전자 메일 열에서 null을 허용 할 수 있지만 validates_uniqueness_of는 nil (또는 공백) 값을 무시하고 사용자가 전자 메일 주소를 지정하지 않고 등록하려고 할 수 있습니까?

+0

아니요, 오류는 항상 전자 메일이 전달되지만 데이터베이스에 이미 있습니다. 나는 또한 전자 메일의 존재를 확인하므로 한 번에 2 개의 유효성 검사에서 레일이 실패하지는 않는다고 생각합니다. – Draiken

+0

그렇게 많은 아이디어가 있습니다. 프로덕션 앱의 오류 로깅 수준을 변경하여 실행중인 쿼리가 표시되도록하는 것이 좋습니다. 대/소문자 구분 문제 일 수도 있고 후행 공백과 관련있을 수도 있습니다. – noodl

1

개발 로그에서 실행중인 SQL을 찾으십시오. WHERE (email = BINARY '[email protected]')과 같은 메시지가 나타나면 [email protected]을 사용하여 사용자를 만들어보십시오. 이제 DB 수준의 복제 예외를 재현 할 수 있습니다.

이 문제를 해결하려면이 config/initializers/patches.rb에 다음 코드를 넣어 : 당신이 보조 노트 2.

레일에 있다면 Mysql2AdapterMysqlAdapter을해야

class ActiveRecord::ConnectionAdapters::Mysql2Adapter 
    def case_sensitive_equality_operator 
    "=" 
    end 
end 

하는 것으로, 그것은 오랜 버그입니다 in Rails IMO - Ruby 레벨에서 대소 문자를 구분하는 것은 전혀 이해가되지 않습니다. 대/소문자를 구분하는 조회가 필요한 경우 utf8_bin의 열 데이터 정렬이 있어야합니다. 대/소문자를 구분하지 않고 조회해야하는 경우에는 utf8_general_ci의 열 데이터 정렬이 있어야합니다. where 절에 BINARY 함수를 적용하면 인덱스 사용이 비활성화되고 validates_uniqueness_of은 레코드를 만들거나 업데이트 할 때마다 전체 테이블을 검색합니다. 수백만 건의 기록이있는 경우 완전히 망했다. 위의 패치로도이 문제가 해결 될 것입니다. 사실,이 패치를 작성하는 것이 내 원래의 동기였습니다.

당신이 동의하는 경우, 제발 한 https://github.com/rails/rails/issues/1399에 :)