Logowanie w stylu rails

Chciałabym dodać do każdej ze stron mojej aplikacji link umożliwiający zalogowanie i wylogowanie(linki do akcji user/login, user/logout). W zależności od tego czy użytkownik jest zalogowany powinien być wyświetlony odpowiedni link. W całej aplikacji w celu sprawdzenia czy użytkownik jest zalogowany używam metody current_user z kotrolera ApplicationController. Linki umieściłem w layoucie application.rhtml w następujący sposób:

[code]


<% if session[:user] %>
jesteś zalogowany jako <%= session[:user].login %>
<%= link_to “Wyloguj”, :controller => “user”, :action => “logout” %>
<% else %>
<%= link_to “Zaloguj”, :controller => “user”, :action => “login” %>
<% end %>
[/code] Zamiast bezpośredniego sprawdzania obecności użytkownika w sesji w celu zachowania spójności wolałbym użyć wspomnianej wcześniej metody current_user. Czy jest jakiś sposób na wywołanie tej metody z layoutu, ewentualnie przekazanie zmiennej, która zawierała by wynik tej metody? Może ktoś ma lepszy pomysł?

Wystarczy (np. w przyp. restful_authentication):

<% if logged_in? -%> zalogowany jako <%= current_user.login %> | <%= link_to "wyloguj", session_path(current_user), :method => :delete %> <% else -%> <%= link_to "zaloguj", new_session_path %> <% end -%>

Możesz oznaczyć tą metodę, tak żeby była również metodą helpera:

[code]class ApplicationController < ActionController::Base

helper_method :current_user[/code]
i wtedy używasz jej w szablonach

Chłopaki dobrze Ci piszą. Ja jeszcze dodam od siebie jedną rzecz, bo po Twoim kodzie

<span class="login"><%= session[:user].login %></span>

wnioskuję, że w sesji trzymasz cały obiekt użytkownika. Najlepiej unikać takich rozwiązać, gdyż w momencie gdy Twój model User zmieni się (dodasz jakiś atrybut) w sesji obiekt będzie nieaktualny (niekompletny). Najlepiej trzymać tam sam id rekordu, który zwykle się nie zmienia :).

Możesz użyć filtru w stylu

def find_user if session[:user_id].nil? @user = nil ... // ewentualny redirect jesli trzeba else @user = User.find(session[:user_id]) end end
przed kazda uzywana metoda a w widoku używać konstrukcji : if @user