2010-08-05 53 views

回答

35

這是一個鐵軌的事情。基本上像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" 
+0

非常感謝!我在當前的API文檔中找不到該方法,因此它只能在Rails 3中使用? – 2010-08-05 03:10:13

+0

根據apidock.com,它自2.1起:) :) – 2010-08-05 03:13:12

+3

會很好的提及'class_attribute'通常是一個更好的解決方案 – 2013-02-10 20:32:11

15

對於那些過這個問題絆倒過,還有在Rails 3中,對於子工程,以做到這一點的新方法:

class_attribute :name 

here一個好的博客文章。

4

定義類屬性

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] 

但4+使用類似的方法mattr_accessor,如cattr_accessor在軌道4,5