在Rails中cattr_accessor?

nev*_*ame 26 ruby-on-rails

我正在阅读Rails 3的Rails指南,他们使用这种方法:

cattr_accessor :attribute
Run Code Online (Sandbox Code Playgroud)

这个方法是什么?它是一个Rails方法吗?我以前从未见过它.

Mat*_*ggs 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" 
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,`class_attribute`通常是更好的解决方案 (3认同)

Jor*_*dan 15

对于那些偶然遇到这个问题的人来说,在Rails 3中有一种新方法可以用于子类:

class_attribute :name
Run Code Online (Sandbox Code Playgroud)

一个好的博客文章就可以了这里.


kam*_*mal 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]
Run Code Online (Sandbox Code Playgroud)

如果子类更改了值,那么这也会更改父类的值.类似地,如果父类更改了值,那么这也会改变子类的值.

class Male < Person
end

Male.hair_colors << :blue
Person.hair_colors # => [:brown, :black, :blonde, :red, :blue]
Run Code Online (Sandbox Code Playgroud)

但对于Rails 4+使用类似的方法mattr_accessor,因为cattr_accessor在rails 4中已弃用

  • 从官方网站复制粘贴..甚至不改变一个词来解释。 (2认同)