Statyczne atrybuty między requestami

Witam,

W swojej aplikacji muszę przekazywać kilka razy modelowi session[:user_id]. Żeby trochę skrócić sobie kod zrobiłem następującą rzecz:

[code=ruby]class ApplicationController < ActionController::Base
before_filter :init_user
after_filter :clear_user

protected

def init_user
session[:user_id] ||= 0
session[:user_login] ||= “Gość”

User.current_user_id = session[:user_id]

end

def clear_user
User.current_user_id = nil
end
end

class User < ActiveRecord::Base
cattr_accessor :current_user_id

end[/code]
Później klasa modelu może sobie sama pobrać id usera: id = User.current_user_id

Teraz problem: w trybie FastCGI klasy są jakoś tam cache’owane. Czy jeśli skorzystam z powyższego kodu, to możliwe jest, że atrybut current_user_id zostanie nadpisany przez inny request i tym samym dostanę id innego użytkownika?

Wolę zająć się tym zawczasu, żeby później uniknąć przysłowiowych “zonków” :wink:

Nie do konca rozumiem dlaczego robisz to w ten sposob?
Masz w sesji :user_id dlaczego przepisujesz to tu:
User.current_user_id = session[:user_id]

[code=“ruby”]class ApplicationController < ActionController::Base
before_filter :init_user

private

def init_user
@logged_user = User.find(session[:user_id]) if session[:user_id]
# albo robisz anonimowego i go
#wyszukujesz gdy session[:user_id] nie jest ustawiony
end
end[/code]
zmienna instancyjna @logged_user zostanie zniszczona po wyjsciu z akcji kontrolera
Z drugiej strony mozesz (jesli dane sie czesto nie zmieniaja i nie ma duzego obciazenia) wzucac do sesji zamiast :user_id to obiekt user.
Wtedy tylko sprawdzac czy obiekt jest obiektem klasy user jesli tak to przypisujesz na @logged_user a jesli nie to robisz to co logika aplikacji od tej sytuacji wymaga.

Ok, ale nie o to chodzi. Potrzebuję, żeby klasa modelu miała dostęp do ID zalogowanego usera. Mogę przekazywać za każdym razem to ID jako parametr przy wywołaniu metody, ale wolałbym mieć wygodniejszy sposób. Twoja metoda nie rozwiązuje tego problemu.

To jest poniekad zlamanie “zasad” MVC.
Przydaloby sie abys w kontrolerze w wywolaniu metod modelu jawnie przekazywal to id jako parametr (to z drugie strony czasami burzy DRY :)).

No w?a?nie - do?? specyficzna sytuacja, ale nie da si? jej omin?? :wink:

// btw: forum cos sie krzaczy pod Safari