2012-04-12 11 views
11

W całym zgłoszeniu self. nie jest konieczne odwoływanie się do nazwy użytkownika. name działa dobrze.Po co używać "self", aby uzyskać dostęp do właściwości modelu ActiveRecord/Rails?

Dlaczego poniższy kod wymaga, aby self działał zgodnie z przeznaczeniem?

class User< ActiveRecord::Base 
    before_save :validate_name 

def validate_name 
    if self.name.nil? || self.name.empty? 
     self.name= "Mr. No Name" 
    end 
end 

Nawiasem mówiąc, wiem, że validates_presence_of może być stosowany w celu zapobiegania uratować, ale chcę zapisać się domyślnie, jeśli nie jest podana nazwa.

Szyny 3.0.7.

Odpowiedz

23

Często użycie self ma na celu zmuszenie Ruby do rozpoznania tego jako wywołania metody, a nie błędnej interpretacji jako zmiennej. Bez wcześniejszej znajomości metody o nazwie day=, wtedy day = "x" wygląda na Ruby jak przypisanie zmiennej. self.day = "x" jest zawsze wywołaniem metody.

Przyczyną jest to, że metody name i name= są dodawane dynamicznie po przeanalizowaniu pliku klasy użytkownika. Pierwszą rzeczą, którą Rails robi podczas korzystania z modelu, jest tworzenie metod dla powiązanych pól bazy danych, ale dzieje się tak po przeanalizowaniu pliku user.rb.

+0

Przepraszam, 'self.day' miał być' self.name'! Zaktualizowałem pytanie. –

+6

Nit: Ruby nigdy nie weźmie 'x = y' do wywołania metody. Jest to zawsze zmienna bezpośrednia (lub stała, w zależności od przypadku). Forma 'x' (jako wyrażenie) zależy od tego, czy istnieje taki' x' w zakresie (jako zmienna) czy nie. –

+0

Jeśli 'name' i' name = 'są dodawane dynamicznie po sparsowaniu pliku klasy, to czy są takie chwile, kiedy' name' oznacza 'self.name' i inne czasy, gdy' name' jest zmienną lokalną? –

Powiązane problemy