2010-08-05 5 views

risposta

35

È una cosa di binari. Fondamentalmente come i metodi attr_ *, ma per il livello di classe. Una cosa che non ti aspetteresti è che utilizza una variabile @@backing, il valore condiviso tra la classe e tutte le istanze.

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

Grazie mille! Non sono riuscito a trovare questo metodo nella documentazione API corrente, quindi deve essere solo in Rails 3? –

+0

secondo apidock.com, è stato intorno dal 2.1 :) –

+3

Sarebbe bello dire che 'class_attribute' è in genere una soluzione migliore –

15

Per coloro che incappare in questo problema anche, c'è un nuovo modo per fare questo in Rails 3 che funziona per le sottoclassi:

class_attribute :name 

Un buon post su di esso here.

4

definisce sia di accesso di classe e istanza per gli attributi di classe

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] 

Se una sottoclasse cambia il valore che poi sarebbe anche cambiare il valore per la classe genitore. Allo stesso modo se la classe genitore cambia il valore, allora cambierebbe anche il valore delle sottoclassi.

class Male < Person 
end 

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

ma per Rails 4+ utilizzano il metodo simile mattr_accessor, come cattr_accessor è deprecato in rotaie 4