현재 링크가있는 이메일 초대장을 보내는 초대 모델을 만들고 있습니다. 링크는 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
답변에 대한 확신이 없지만 최근에 비슷한 초대 시스템을 구현했습니다. 내 요구에 맞게 다음 자습서를 수정했습니다. 편리하다고 생각할 수도 있습니다. http://railscasts.com/episodes/124-beta-invitations – Karan
비교가 실패 할 때 예제를 제공하십시오. @ invitation.hash와 params [: hash]를 "넣습니다". 확인하자 :) – Eduardo
또한 인코딩과 관련이있을 수 있습니다. 비교하기 전에 두 문자열 모두에서 이것을 실행하면 어떨까요? '.force_encoding (Encoding :: BINARY)'(16 진수가 이미 ASCII와 같은 친숙한 방식으로 인코딩되어 있지 않다면 (예 : Base 64) – Linuxios