Im czytanie szyn prowadzi do szyny 3 i używają tej metody:cattr_accessor in Rails?
cattr_accessor :attribute
Co to jest metoda? Czy to jest metoda Rails? Nigdy wcześniej tego nie widziałem.
Im czytanie szyn prowadzi do szyny 3 i używają tej metody:cattr_accessor in Rails?
cattr_accessor :attribute
Co to jest metoda? Czy to jest metoda Rails? Nigdy wcześniej tego nie widziałem.
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"
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.
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
ta została zaniechana w najnowszej wersji Rails. http://apidock.com/rails/Class/cattr_accessor
Wielkie dzięki! Nie mogłem znaleźć tej metody w aktualnej dokumentacji API, więc musi ona być tylko w Rails 3? –
według apidock.com, jest już od 2.1 :) –
Warto wspomnieć, że 'class_attribute' jest zwykle lepszym rozwiązaniem –