Im leggendo le rotaie guida per Rails 3 e usano questo metodo:cattr_accessor in Rails?
cattr_accessor :attribute
Che cosa è questo metodo? È un metodo Rails? Non l'ho mai visto prima.
Im leggendo le rotaie guida per Rails 3 e usano questo metodo:cattr_accessor in Rails?
cattr_accessor :attribute
Che cosa è questo metodo? È un metodo Rails? Non l'ho mai visto prima.
È 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"
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.
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
Questa è stata deprecata nella recente versione Rails. http://apidock.com/rails/Class/cattr_accessor
Grazie mille! Non sono riuscito a trovare questo metodo nella documentazione API corrente, quindi deve essere solo in Rails 3? –
secondo apidock.com, è stato intorno dal 2.1 :) –
Sarebbe bello dire che 'class_attribute' è in genere una soluzione migliore –