private
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.user
end
end[/code]
Czemu metody current_user, current_user_session niekorzystają z operatora ||= (wie ktoś jak on ladnie się nazywa?)
[code]def current_user_session @current_user_session ||= UserSession.find
end
def current_user @current_user ||= current_user_session && current_user_session.user
end[/code]
Implementacja korzytająca z defined? jest w jakiś sposób lepsza?
irb(main):008:0> @current_user = nil
=> nil
irb(main):009:0> @current_user ||= (puts "nie ma cache, trza ustawic"; true)
nie ma cache, trza ustawic
=> true
ale:
irb(main):010:0> @current_user = nil
=> nil
irb(main):012:0> puts "current user='#{@current_user}'" if defined?(@current_user)
current user=''
=> nil
||= odpala prawą stronę jeśli po lewej jest nil. A w wypadku braku usera tak właśnie będzie. Twoja wersja będzie ZAWSZE szukać usera od początku jeśli taki nie istnieje.
Podejrzewam, że filtr wcześniej już ustawił @current_user na nil a user_session.save nie zmieniło tej wartości. Chyba musisz ręcznie ustawić @current_user:
[code=ruby]user_session = UserSession.new(params)
if user_session.save @current_user = user_session.user