2012-05-03 43 views
0

我目前正在構建一個邀請模型,通過鏈接發出電子郵件邀請。這些鏈接用sha1哈希'保證'。然而,控制器無法驗證散列,我想不通爲什麼...Rails字符串比較在一個十六進制字符串上失敗

生成的鏈接看起來像

/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 
     .... 

字符串比較每次都失敗。我已經三重檢查過了,但這些字符串看起來完全相同。

編輯:一些調試信息

logger.debug params 
logger.debug @invitation.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

給我們一個比較失敗的例子。 「puts」@ invitation.hash和params [:hash]。讓我們檢查一下:) – Eduardo

+0

另外,這可能與編碼有關。如果在比較之前你在兩個字符串上執行了這個操作? '.force_encoding(Encoding :: BINARY)'(除非十六進制已經以某種ASCII友好的方式編碼,例如Base 64) – Linuxios

回答

1

看看@invitation.hash沒有實際調用Object#hash

+0

這樣做會有道理,但是日誌文件似乎表明它不是名稱衝突 – TuxM

+0

Dang it!你是對的,我只是重新命名了專欄,現在它可以工作。即使日誌顯示的是invitation.hash的正確值,該比較也會使用Object#哈希值。非常感謝! – TuxM

相關問題