2012-05-03 125 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

相关问题