2010-08-05 13 views

Odpowiedz

35

To jest coś na szynach. Zasadniczo jak metody attr_ *, ale na poziomie klasy. Jedną rzeczą, której się nie spodziewałbyś, jest to, że używa ona zmiennej @@, wartości dzielonej między klasą i wszystkimi instancjami.

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

Wielkie dzięki! Nie mogłem znaleźć tej metody w aktualnej dokumentacji API, więc musi ona być tylko w Rails 3? –

+0

według apidock.com, jest już od 2.1 :) –

+3

Warto wspomnieć, że 'class_attribute' jest zwykle lepszym rozwiązaniem –

15

Dla tych, które natknąć to pytanie też nie jest nowym sposobem, aby to zrobić w Rails 3, który pracuje dla podklasy:

class_attribute :name 

Dobrym blogu na nim here.

4

definiuje zarówno klas i instancji akcesorów do atrybutów klasy

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] 

Jeśli podklasa zmienia wartość wtedy, że także zmienić wartość dla klasy nadrzędnej. Podobnie, jeśli klasa nadrzędna zmienia wartość, to również zmieniałaby się wartość podklas.

class Male < Person 
end 

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

ale dla Rails 4+ wykorzystujących podobną metodę mattr_accessor, jak cattr_accessor jest przestarzałe w szynach 4

Powiązane problemy