Aktualnie przechodzę przez samouczek RoR (http://railstutorial.org/chapters/sign-in-sign-out#sec:signin_success jest odpowiednią sekcją), która wydaje się być całkiem dobra, chociaż napotkam następujący problem podczas próby wyświetlenia przykładowej strony .niezdefiniowana zmienna lokalna lub metoda 'current_user'
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 %>
Jak widać, problem wynika z mojej metody "signed_in?" która ma na celu sprawdzenie, czy użytkownik jest zalogowany czy nie sprawdzając, czy zmienna jest ustawiona current_user (podaję resztę kodu z pomocnika dać kontekst, przepraszam):
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
Z moje zrozumienie, .nil? jest metodą, która sprawdza, czy obiekt został zdefiniowany, a zatem niezdefiniowany obiekt nie powinien generować błędu, ale raczej zwracać fałsz? Przeszukałem samouczek dla wszystkich przypadków current_user (przed sprawdzeniem, czy ktoś inny miał ten problem z małym sukcesem) i mój kod wydaje się poprawny, więc jestem trochę zdezorientowany i jeśli ktoś jest w stanie mi pomóc zrozumieć, w jaki sposób są zmienne Ruby powinien być dostępny i dlaczego mój kod nie działa, byłbym bardzo wdzięczny.
Edit:
Nie jestem pewien, czy to ważne z zakresu jako Dopiero zaczynam obu szyn i Ruby, jednakże SessionsHelper pomocnik jest używany przez mojego kontrolera użytkowników i odsłon (to jest wliczone w mojej aplikacji kontroler)
lub Uważam, że można zrobić "@current_user || = user_from_remember_token || false", jeśli chcesz być bardziej zgodny z bieżącym kodem. – JackCA
Podczas gdy to na pewno zatrzymuje błąd, ciągle zwraca fałszywe. Wydaje mi się, że jest możliwe, że może występować problem z moim podpisywaniem metod, które powodują, że użytkownik current_user nigdy nie zostanie zdefiniowany, więc prawdopodobnie najlepiej będzie, gdy spojrzę na niego po dobrze przespanej nocy. – djlumley