2010-07-19 66 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中使用的所有比較的更多信息。