Подтвердить что ты не робот

Cattr_accessor в Rails?

Im читает направляющие Rails для Rails 3, и они используют этот метод:

cattr_accessor :attribute

Что это за метод? Это метод Rails? Я никогда не видел его раньше.

4b9b3361

Ответ 1

Это рельсовая вещь. В принципе, как методы attr_ *, но для уровня класса. Единственное, чего вы не ожидаете, это то, что он использует переменную backing @@, значение, разделяемое между классом и всеми экземплярами.

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" 

Ответ 2

Для тех, кто наткнулся на этот вопрос, есть новый способ сделать это в Rails 3, который работает для подклассов:

class_attribute :name

Хорошее сообщение в блоге на нем здесь.

Ответ 3

Определяет класс и экземпляры экземпляров для атрибутов класса

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]

Если подкласс изменяет значение, это также изменит значение для родительского класса. Аналогично, если родительский класс изменяет значение, то это также изменит значение подклассов.

class Male < Person
end

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

но для Rails 4+ используйте аналогичный метод mattr_accessor, поскольку cattr_accessor устарел в рельсах 4