2012-05-03 10 views
0

現在、リンク付きのEメール招待状を送信する招待モデルを構築中です。リンクはsha1ハッシュで '保護されています'。ただし、コントローラはハッシュを検証するために失敗し、私はRails文字列の比較が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 
     .... 

文字列の比較は毎回失敗します。私はトリプルチェックしましたが、文字列は完全に同じようです。

EDIT:いくつかのデバッグ情報development.logで次の出力で

logger.debug params 
logger.debug @invitation.hash 

結果

{"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]の両方を "put"します。チェックしましょう:) – Eduardo

+0

また、これはエンコードと関係があります。比較の前に両方の文字列でこれを実行するとどうなりますか? '.force_encoding(Encoding :: BINARY)'(16進数が既にASCIIのような親和的な方法でコード化されていない限り、例えばBase 64) – Linuxios

答えて

1

@invitation.hashが実際にObject#hashを呼び出していないかどうかを確認してください。

+0

それは理にかなっていますが、ログファイルは名前の衝突ではないことを示しています。 – TuxM

+0

Dang it!あなたが正しいです、私はちょうど列の名前を変更し、今それは動作します。ログはinvitation.hashの正しい値を示していますが、比較ではObject#ハッシュが使用されます。どうもありがとう! – TuxM