Undefinierte lokale variable oder Methode 'current_user'
Ich bin derzeit in einer RoR tutorial (http://railstutorial.org/chapters/sign-in-sign-out#sec:signin_success ist der entsprechende Abschnitt), die scheint ziemlich gut, obwohl ich in ausführen Folgendes problem beim anzeigen der Beispiel-Website.
Extracted source (around line #10):
7: <li><%= link_to "Home", root_path %></li>
8: <li><%= link_to "About", about_path %></li>
9:
10: <% if signed_in? %>
11: <li><%= link_to "Profile", current_user %></li>
12: <li><%= link_to "Sign out", signout_path, :method => delete %></li>
13: <% else %>
Wie Sie sehen können, das Problem ist die aus meiner Methode "signed_in?", was soll überprüfen, ob der Benutzer eingeloggt ist oder nicht, indem überprüft wird, ob der current_user-variable gesetzt ist (ich habe den rest von dem code aus dem Hilfsprogramm geben, um ein Kontext, Entschuldigung):
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
current_user = user
end
def sign_out
cookies.delete[:remember_token]
current_user = nil
end
def current_user= (user)
@current_user ||= user_from_remember_token
end
def signed_in?
!current_user.nil?
end
private
def user_from_remember_token
User.authenticate_with_salt(*remember_token)
end
def remember_token
cookies.signed[:remember_token] || [nil, nil]
end
end
Aus meinem Verständnis .nil? ist eine Methode, die prüft, ob ein Objekt nicht definiert wurde und daher das Objekt wird nicht definiert, sollte nicht einen Fehler erzeugen, sondern false zurückgeben? Ich suchte die Anleitung für alle Fälle von current_user (vor der Prüfung zu sehen, ob jemand anderes hatte dieses problem mit wenig Erfolg) und mein code scheint korrekt zu sein, also bin ich ein wenig verwirrt, und wenn jemand in der Lage ist, mir zu helfen, zu verstehen, wie Ruby Variablen sind, soll angesprochen werden und warum mein code nicht funktioniert, wäre ich sehr dankbar.
Edit:
Ich bin mir nicht sicher, wenn es wichtig ist, mit dem Umfang wie ich bin erst am Anfang beide Rails und Ruby, aber die Helfer SessionsHelper wird von meiner Benutzer-controller und-Ansichten (es gehört zu meinen Anwendungen controller)
InformationsquelleAutor djlumley | 2010-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief in das gleiche Problem & es war aus dem gleichen Grund. Sie übersehen einen Teil der Anweisungen, die auf 'Listing 9.16'.
Euch wurden soll dies ändern und die folgenden.
Werden Sie auch wollen, ändern Sie alle Instanzen von *selbst.*current_user an *@*current_user.
Sobald Sie dies tun, der Fehler(s) aufgelöst werden.
InformationsquelleAutor Mentat
Stellen Sie sicher, dass Sie den folgenden code in die SessionHelper
InformationsquelleAutor Thorpe Obazee
Den nil? die Methode ist nicht zu prüfen, ob eine variable oder Methode definiert ist. Es ist allein zu prüfen, ob er ist definiert als ein null-Objekt ist oder nicht. Ruby geht der Vorfahren Kette für SessionsHelper und schließlich feststellt, dass current_user ist nicht definiert, überall (es wird schließlich an Kernel#method_missing), und wirft dann einen Fehler aus. Der Schnellste Weg, das problem zu lösen wäre:
Während dies sicherlich Stoppt die Fehler, es ist ständig Rückgabe von false. Ich denke, es ist möglich, dass es könnte ein problem mit meiner Unterzeichnung in Methoden, die zu einer current_user nie so definiert werden wahrscheinlich am besten für mich, um einen Blick auf Sie nach einem guten Schlaf.
InformationsquelleAutor Patrick Robertson
Ich einen Freund gefragt, und er korrigiert meine Fehler. Ich denke, einen großen Teil meiner Fehler kam nicht völlig vertraut mit dem Geltungsbereich von Variablen in Ruby und vergessen, dass alles ein Objekt ist und daher die Methode current_user=(user) überschreiben die Zuordnung Funktion.
Mein Freund die Lösung war die änderung des Umfangs der current_user, um eine instanzierte variable (damit es vernünftig benutzt werden kann), und ändern Sie die Funktion curent_user=(user), um eine einfache get_current_user-Funktion, um zu bestimmen, ob der aktuelle Benutzer ist in der cookie.
Die endgültige geänderte code ist wie folgt:
Wie Sie sehen, kann die variable in meinem Kopf teilweise wurde auch geändert, um zu reflektieren die Methode, die verwendet der Helfer zu erhalten die Benutzer.
Gehen zu Beginn der Lektüre einige grundlegende Ruby-guides also das nächste mal, dass ich Sie über meinem Kopf ich habe eine Idee, wo Sie anfangen es zu beheben 🙂
Gibt es einen bestimmten Grund für? Oder ist es, wie die meisten Schienen Dinge zu sein scheinen, nur weil das ist, wie Menschen es tun? Ich kann eine Erhöhung von Lesbarkeit, einfach Fragen, wenn es gibt einen anderen Grund, dass ich bin fehlt.
Es ist nicht nur eine Rails-Sache. Die Ruby-Konvention für die Getter und setter ist attribute_name() and Attributname=(). Die Möglichkeit zum hinzufügen ? zu Methode-Namen beabsichtigt war, so dass Entwickler zu bilden zusammenhängende Fragen. Ruby ist so konzipiert, dass möglichst dialogorientiert wie möglich.
InformationsquelleAutor djlumley