Jak do tej pory nie używałem za dużo modułów, i jeszcze do końca ich nie ogarniam. Mam pytanko, self w tych metodach odnosi się do czego?
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def sign_out
self.current_user=nil
cookies.delete(:remember_token)
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
end
Do instancji klasy, do której ten moduł wmiksujesz.
EDIT: A jeśli modułu nie miksujesz, tylko rozszerzasz tym modułem klasę albo dowolny inny obiekt (jest to tak naprawdę miksowanie modułu do klasy singletonowej tego obiektu), to odnosi się do rozszerzanej klasy/obiektu oczywiście.
W momencie gdy includujesz moduł do klasy A, to ruby tworzy anonimową klasę z metodami z SessionHelper z której klasa A dziedziczy. Czyli twoja klasa ‘dziedziczy’ wszystkie metody z SessionHelper. Polecam przeczytać: http://pragprog.com/book/ppmetr/metaprogramming-ruby
++
Sam tę książkę przeczytałem i mam ją zawsze na podorędziu, żeby móc do niej w każdej chwili zajrzeć.
Ma niezerowy (choć raczej niski) próg wejścia, ale wyjaśnia te rubiowe niuanse w sposób bardzo przejrzysty, podpierając się jeszcze śwetymi przykładami użycia różnych metaprogramistycznych technik w Railsach.
Polecam.
Ok, chyba rozmiem. Tylko normalnie metody odpalam w sposób Nazwaklasy.metoda lub nazwainstancji.metoda.
Tutaj ten modul jest includowany do ApplicationController i wszystkie te metody uruchamiam zwyczajnie bez tej nazwy klasy czy instancji czyli gołe ‘sign_in user czy signed_in?’. Dlaczego tak sie dzieje?
[quote=doli]Ok, chyba rozmiem. Tylko normalnie metody odpalam w sposób Nazwaklasy.metoda lub nazwainstancji.metoda.
Tutaj ten modul jest includowany do ApplicationController i wszystkie te metody uruchamiam zwyczajnie bez tej nazwy klasy czy instancji czyli gołe ‘sign_in user czy signed_in?’. Dlaczego tak sie dzieje?[/quote]
Kiedy nie podajesz jawnie nazwy obiektu, na którym wywołujesz metodę, domyślnym odbiorcą komunikatu jest self. Jeśli jest to metoda przypisująca (z “=” na końcu), to odbiorcę musisz podać jawnie, bo inaczej interpreter Ruby weźmie ten zapis za inicjalizację zmiennej lokalnej.