2012-05-03 6 views
0

현재 링크가있는 이메일 초대장을 보내는 초대 모델을 만들고 있습니다. 링크는 sha1 해시로 '보안'되어 있습니다. 그러나, 컨트롤러는 해시를 확인하는 데 실패하고 난16 진수 문자열에서 레일 문자열 비교가 실패합니다.

생성 된 링크가

/projects/1/invitations/12?hash=c043b70c359a85e20cd9933c9cd37ef3f8943d7b 

처럼 ... 이유를 알아낼 수 없습니다 및 컨트롤러는 그들을 확인하려고

def show 
    @invitation = Invitation.find(params[:id]) 
    if @invitation.hash.to_s != params[:hash].to_s 
     redirect_to root_url 
     .... 

문자열 비교는 매번 실패합니다. 세 번 확인했는데 문자열이 완전히 똑같은 것 같습니다.

편집 : 일부 디버깅 정보 @invitation.hash 실제로 Object#hash를 호출하지 않은 경우 development.log 파일

{"hash"=>"c043b70c359a85e20cd9933c9cd37ef3f8943d7b", "action"=>"show", 
controller"=>"invitations", "project_id"=>"1", "id"=>"12"} 
c043b70c359a85e20cd9933c9cd37ef3f8943d7b 
+1

답변에 대한 확신이 없지만 최근에 비슷한 초대 시스템을 구현했습니다. 내 요구에 맞게 다음 자습서를 수정했습니다. 편리하다고 생각할 수도 있습니다. http://railscasts.com/episodes/124-beta-invitations – Karan

+2

비교가 실패 할 때 예제를 제공하십시오. @ invitation.hash와 params [: hash]를 "넣습니다". 확인하자 :) – Eduardo

+0

또한 인코딩과 관련이있을 수 있습니다. 비교하기 전에 두 문자열 모두에서 이것을 실행하면 어떨까요? '.force_encoding (Encoding :: BINARY)'(16 진수가 이미 ASCII와 같은 친숙한 방식으로 인코딩되어 있지 않다면 (예 : Base 64) – Linuxios

답변

1

에 다음과 같은 출력

logger.debug params 
logger.debug @invitation.hash 

결과를 참조하십시오.

+0

로그 파일은 이름 충돌이 아님을 나타냅니다. – TuxM

+0

Dang it! 당신 말이 맞아요, 방금 칼럼의 이름을 바꿨고 지금은 작동합니다. 로그가 invitation.hash의 올바른 값을 나타내더라도 비교에서는 Object # 해시를 사용합니다. 고마워요! – TuxM