2012-04-12 9 views
11

Per tutta la mia applicazione self. non è necessario fare riferimento al nome di un utente. name funziona correttamente.Perché utilizzare "self" per accedere alle proprietà del modello ActiveRecord/Rails?

Perché il seguente codice richiede che self funzioni come previsto?

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 

A proposito, so che validates_presence_of può essere usato per prevenire il salvataggio, ma voglio salvare con un default se non viene dato alcun nome.

Rails 3.0.7.

risposta

23

Spesso l'uso di self consiste nel forzare Ruby a riconoscerlo come una chiamata al metodo e non a interpretarlo erroneamente come variabile. Senza la previa conoscenza di un metodo chiamato day=, quindi day = "x" guarda a Ruby come un'assegnazione di variabile. self.day = "x" è sempre una chiamata al metodo.

Il motivo per cui questo è un problema è dovuto al fatto che i metodi name e name= vengono aggiunti dinamicamente dopo che il file di classe User è stato analizzato. La prima cosa che Rails fa quando si utilizza un modello è creare metodi per i campi del database associati, ma ciò accade dopo aver analizzato il file user.rb.

+0

Siamo spiacenti, 'self.day' doveva essere' self.name'! Ho aggiornato la domanda. –

+6

Nit: Ruby non prenderà mai 'x = y' come una chiamata al metodo. È sempre una variabile diretta (o costante, in base al caso). La forma 'x' (come espressione) dipende se esiste un tale' x' in ambito (come variabile) o meno. –

+0

Se 'name' e' name = 'vengono aggiunti dinamicamente dopo che il file di classe viene analizzato, ci sono momenti in cui' name' significa 'self.name' e altre volte in cui' name' è una variabile locale? –

Problemi correlati