Self w module?

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. :slight_smile:

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?

ps. dzieki za info o ksiazce, na pewno przeczytam

[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.

I wszystko jasne, dzięki :slight_smile:

apropo tej książki - czy to co w niej zawarte odnosi się rółnież do rubego 2.0 ?

To jeszcze jedno pytanko? w widoku też nie podaję jawnie nazwy obiektu, to znaczy, że view to jest jakaś część obiektu kontrolera?

Nie, ale helpery są includowane do ActionView::Base, dzięki czemu właśnie metody helperowe są dostępne w widoku.

Ok, dzięki.