2010-07-19 3 views
10

Ich bin neu auf Schienen nach dem Umzug von PHP und habe kein Ende der Frustrationen, aber hoffentlich gibt es eine steile Lernkurve.Schienen vergleichen Werte von params [: ID] und Sitzung [: user_id] funktioniert nicht

Ich folgte einem Leitfaden, wie man einen Twitter-Klon in Rails machen kann, und habe diesen Weg weiter verfolgt, so dass es mehr und mehr Twitter gefällt.

So habe ich eine 'Benutzer' Seite /users/show.html.erb, die alle Beiträge von einem Benutzer zeigen.

Jetzt, wenn der aktuell angemeldete Benutzer derselbe ist wie der Seitenbesitzer, versuche ich das Textfeld anzuzeigen, damit der Benutzer einen neuen Eintrag hinzufügen kann.

ich habe, was eine sehr einfache

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

natürlich sein sollte, dass nicht funktioniert, sondern direkt darüber Ich habe Ausgabe sowohl die Sitzung [: user_id] und die params [: id], und der Ausdruck ist genau derselbe.

Wenn ich die == zu! = Setze, bekomme ich die Nachricht "put the text box here".

irgendwelche Vorschläge, was ich falsch mache? Ich weiß, dass diese beiden Werte übereinstimmen, wie ich in der URL und der Ausgabe des aktuell angemeldeten Benutzers sehen kann. Ich habe auch die Ausgabe

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

so, dass ich es sehen kann an beiden Enden der Parameter keine Lücken oder Leerzeichen oder andere Zeichen, und es sieht alles sauber.

Die Ausgabe sieht wie folgt aus

 
-4c4483ae15a7900fcc000003- 
-4c4483ae15a7900fcc000003- 

die mit Strichen auf beiden Seiten der mongodb objectId des Benutzers ist es zu zeigen, dass es keine Leerzeichen oder nichts sind.

+0

Rufen Sie '.inspect' auf, bevor Sie sie ausdrucken, um ihre wahren Werte zu sehen, nicht nur ihre Zeichenfolgenwerte. – mckeed

Antwort

16

Sind Sie sicher, dass beide Elemente einfache Zeichenfolgen sind? Was passiert, wenn Sie laufen, sagen

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

?

+0

Dies ist höchstwahrscheinlich. Sie können versuchen, 'params [: id] .class' und' session [: user_id] .class' ebenfalls auszudrucken, um den Typ zu sehen. – Karl

2

Es könnte wie jasonpgignac darauf hingewiesen werden. Wenn Sie IRB eingeben:

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

Stellen Sie sicher, dass beide vom selben Typ sind. Putting <%= num2 %> wird tatsächlich die .to_s Methode auslösen ... daher, warum die beiden gleich erscheinen, wenn Sie sie in Ihrer .erb-Seite ausgeben.

Sie können diesen Vergleich auch in den Controller verschieben. Etwas wie:

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

Dann können Sie Ihrer Ansicht nach setzen:

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

Es macht den Code ein wenig leichter zu lesen.

0

Wie bereits erwähnt, wird diese Art von Problemen in den meisten Fällen durch die Nichtübereinstimmung der verglichenen Typen verursacht. Das Hinzufügen von to_s zu beiden Variablen löst die meisten Fälle.

Here überprüfen Sie große Quelle, um mehr über alle Arten von Vergleichen in Ruby verwendet zu lernen.