2010-07-19 65 views
10

从PHP移动到PHP之后,我对rails不熟悉,但希望有一个陡峭的学习曲线。rails比较params [:id]和session [:user_id]无法正常工作的值

我正在关注如何在rails中制作twitter clone的指南,并且沿着这条道路继续前进,使它越来越像twitter。

所以我有一个'用户'页面/users/show.html.erb显示用户的所有帖子。

现在,如果当前登录的用户与页面所有者相同,我试图显示文本框,以便用户可以添加新条目。

我有什么应该是一个非常简单的

 
<% if params[:id] == session[:user_id] %> 
    put the text box here 
<% end %> 
当然

,不工作,但正上方我已经输出两个会话[:USER_ID]和PARAMS [: id],并且打印输出完全相同。

如果我将==设置为!=,我会得到'把文本框放在这里'的消息。

对我在做什么错的任何建议? 我知道这两个值匹配,因为我可以在url和当前登录用户的输出中看到。我也输出

 
-<% session[:user_id] %>- 
-<% params[:id] %>- 

,这样我可以看到有关于参数的两端无间隙或空格或其他字符,而这一切看起来干净。

输出看起来像这样

 
-4c4483ae15a7900fcc000003- 
-4c4483ae15a7900fcc000003- 

这是两边有破折号用户的MongoDB的OBJECTID表明,没有空格或任何东西。

+0

在将它们打印出来之前调用'.inspect'来查看它们的真实值,而不仅仅是它们的字符串值。 – mckeed 2010-07-19 17:57:18

回答

16

你确定这两个项目都是简单的字符串吗?如果你跑步,会发生什么,说

params[:id].to_s == session[:user_id].to_s 

+0

这是最有可能的。你可以尝试打印'params [:id] .class'和'session [:user_id] .class'来查看类型。 – Karl 2010-07-19 17:45:53

2

它可能就像jasonpgignac指出的那样。如果您输入IRB:

num = "7" 
num2 = 7 
num == num2 # => false 

确保它们都属于同一类型。把<%= num2 %>实际上会触发.to_s方法...因此,当你在.erb页面输出时,两者看起来是平等的。

另外,您可能希望将该比较移入控制器。喜欢的东西:

@is_user_home = params[:id].to_s == session[:user_id].to_s 

然后你就可以把你的观点:

<% if @is_user_home %> 
    code here 
<% end %> 

它使得代码更易于阅读。

0

如前所述,在大多数情况下,这类问题是由于比较类型不匹配造成的。只需在两个变量中添加to_s即可解决大多数情况。

Here查看更多关于Ruby中使用的所有比较的更多信息。