rails比较params [:id]和session [:user_id]的值不起作用

时间:2010-07-19 17:15:09

标签: ruby-on-rails string-comparison

在从PHP转移到摇滚乐之后,我不再擅长轨道了,但希望有一个陡峭的学习曲线。

我正在关注如何在rails中制作一个Twitter克隆的指南,并继续沿着这条路径使它越来越像Twitter。

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

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

我有一个非常简单的

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

当然,这不起作用,但正好在它之上我输出了会话[:user_id]和参数[:id],打印输出完全相同。

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

关于我做错了什么的任何建议? 我知道这两个值匹配,正如我在网址和当前登录用户的输出中看到的那样。我也输出了

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

这样我就可以看到参数两端没有间隙或空格或其他字符,而且看起来都很干净。

输出看起来像这样

-4c4483ae15a7900fcc000003-
-4c4483ae15a7900fcc000003- 

这是用户的mongodb objectId,左侧有破折号,表示没有空格或任何内容。

3 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分: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 %>

它使代码更容易阅读。

答案 2 :(得分:0)

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

Here检查很好的资源,以了解有关Ruby中使用的所有比较的更多信息。