2012-04-12 10 views
11

A lo largo de mi aplicación self. no es necesario hacer referencia al nombre de un usuario. name funciona bien.¿Por qué usar "self" para acceder a las propiedades del modelo ActiveRecord/Rails?

¿Por qué el siguiente código requiere self para funcionar como se esperaba?

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 

Por cierto, sé que validates_presence_of se pueden utilizar para prevenir el salve, pero quiero ahorrar con un defecto si no se da nombre.

Rails 3.0.7.

Respuesta

23

A menudo, el uso de self consiste en forzar a Ruby a reconocer que, como método, llamar y no malinterpretarlo como una variable. Sin conocimiento previo de un método llamado day=, entonces day = "x" se ve a Ruby como una asignación variable. self.day = "x" es siempre una llamada de método.

La razón por la que esto es un problema es porque los métodos name y name= se agregan dinámicamente después de que se haya analizado el archivo de clase de usuario. Lo primero que hace Rails al usar un modelo es crear métodos para los campos de base de datos asociados, pero esto ocurre después de que su archivo user.rb es analizado.

+0

Lo sentimos, 'self.day' se suponía que era' self.name'! Actualicé la pregunta. –

+6

Nit: Ruby nunca tomará 'x = y' para ser una llamada a método. Siempre es una asignación de variable directa (o constante, según el caso). La forma 'x' (como expresión) depende de si existe tal 'x' en el alcance (como una variable) o no. –

+0

Si 'name' y' name = 'se agregan dinámicamente después de analizar el archivo de clase, ¿hay momentos en que' name' significa 'self.name' y otras veces cuando' name' es una variable local? –

Cuestiones relacionadas