2010-08-05 5 views
20

Im lectura de los rieles guía para carriles 3 y que utilizan este método:cattr_accessor en Rails?

cattr_accessor :attribute 

¿Qué es este método? ¿Es un método Rails? Nunca lo había visto antes

Respuesta

35

Es una cosa de rieles. Básicamente me gusta los métodos attr_ *, pero para el nivel de clase. Una cosa que no esperaría es que utiliza una variable de respaldo @@, el valor compartido entre la clase y todas las instancias.

ree-1.8.7-2010.02 > class Foo 
ree-1.8.7-2010.02 ?> cattr_accessor :bar 
ree-1.8.7-2010.02 ?> end 
=> [:bar] 
ree-1.8.7-2010.02 > foo1 = Foo.new 
=> #<Foo:0x4874d90> 
ree-1.8.7-2010.02 > foo2 = Foo.new 
=> #<Foo:0x4871d48> 
ree-1.8.7-2010.02 > foo1.bar = 'set from instance' 
=> "set from instance" 
ree-1.8.7-2010.02 > foo2.bar 
=> "set from instance" 
ree-1.8.7-2010.02 > Foo.bar 
=> "set from instance" 
+0

¡Muchas gracias! No pude encontrar ese método en la documentación actual de la API por lo que tiene que estar en Rails 3 solamente? –

+0

de acuerdo con apidock.com, ha estado presente desde 2.1 :) –

+3

Sería bueno mencionar que 'class_attribute' es típicamente una mejor solución –

15

Para aquellos que tropiezan a través de esta pregunta también, hay una nueva manera de hacer esto en Rails 3 que funciona para subclases:

class_attribute :name 

Un buen blog el que here.

4

define tanto descriptores de acceso de clase e instancia para los atributos de la clase

class Person 
    cattr_accessor :hair_colors 
end 

Person.hair_colors = [:brown, :black, :blonde, :red] 
Person.hair_colors  # => [:brown, :black, :blonde, :red] 
Person.new.hair_colors # => [:brown, :black, :blonde, :red] 

Si una subclase cambia el valor a continuación, que también cambie el valor de la clase padre. De manera similar, si la clase principal cambia el valor, eso también cambiaría el valor de las subclases.

class Male < Person 
end 

Male.hair_colors << :blue 
Person.hair_colors # => [:brown, :black, :blonde, :red, :blue] 

pero para rieles 4+ utilizan método similar mattr_accessor, como cattr_accessor está en desuso en los carriles 4