Im читает направляющие Rails для Rails 3, и они используют этот метод:
cattr_accessor :attribute
Что это за метод? Это метод Rails? Я никогда не видел его раньше.
Im читает направляющие Rails для Rails 3, и они используют этот метод:
cattr_accessor :attribute
Что это за метод? Это метод Rails? Я никогда не видел его раньше.
Это рельсовая вещь. В принципе, как методы 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"
Для тех, кто наткнулся на этот вопрос, есть новый способ сделать это в Rails 3, который работает для подклассов:
class_attribute :name
Хорошее сообщение в блоге на нем здесь.
Определяет класс и экземпляры экземпляров для атрибутов класса
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
Это было устаревшим в недавней версии Rails. http://apidock.com/rails/Class/cattr_accessor