我正在阅读Rails 3的Rails指南,他们使用这种方法:
cattr_accessor :attribute
这种方法是什么?它是一个Rails方法吗?我以前从未见过它。
答案 0 :(得分:41)
这是一个铁路的东西。基本上像attr_ *方法,但是对于类级别。你不希望的一件事是因为它使用了一个支持@@变量,这个值在类和所有实例之间共享。
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"
答案 1 :(得分:15)
答案 2 :(得分:6)
定义类属性的类和实例访问器
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在rails 4中已弃用
答案 3 :(得分:0)
这在最近的Rails版本中已被弃用。 http://apidock.com/rails/Class/cattr_accessor