在Ruby 1.9中访问类变量的正确方法是什么?

Geo*_*Hug 21 ruby ruby-on-rails

我正在尝试设置一些类变量来存储Rails应用程序中的路径(但我认为这更像是一个红宝石问题)

基本上我的班级看起来像这样

class Image < ActiveRecord::Base

   @@path_to_folder = "app/assets"
   @@images_folder = "upimages"
   @@path_to_images = File.join(@@path_to_folder, @@images_folder)

end
Run Code Online (Sandbox Code Playgroud)

但是当我尝试通过操作@@path_to_images从我的控制器访问时Image.path_to_images,我得到一个NoMethodError

当我尝试时Image.class_eval( @@path_to_images ),我明白了uninitialized class variable @@path_to_images in ImagesController

我已经四处寻找,我所看到的一切都说会有用,所以我对此非常困惑

更重要的是,我尝试使用ruby控制台来定义简单类

 class Bidule
     @@foo = "foo"
     Bar = "bar"
 end
Run Code Online (Sandbox Code Playgroud)

因此,我认为,我尝试了所有可能的方法(包括前2个)来访问它们,但我总是得到一个例外

Sou*_*amy 24

Rails为此功能提供类级别属性访问器

尝试

class Image < ActiveRecord::Base
  cattr_accessor :path_to_folder
  @@path_to_folder = "app/assets"
end
Run Code Online (Sandbox Code Playgroud)

然后访问path_to_folder类变量就可以了

Image.path_to_folder
Run Code Online (Sandbox Code Playgroud)

但人们总是建议避免类变量,因为它在继承中的行为.所以你可以使用像常量这样的常量

class Image < ActiveRecord::Base
   PATH_TO_FOLDER = "app/assets"
end
Run Code Online (Sandbox Code Playgroud)

然后你就可以访问常量了

Image::PATH_TO_FOLDER
Run Code Online (Sandbox Code Playgroud)


Pet*_*vin 9

虽然我一般不会推荐它,但您可以通过将字符串传递给以下来访问类变量class_eval:

Image.class_eval('@@path_to_folder')
Run Code Online (Sandbox Code Playgroud)

至少在Ruby的更高版本中.

但请注意,类变量与子类层次结构中最高级的类相关联.对于像这样的ActiveRecord子类,这意味着这些类变量确实存在于名称空间中ActiveRecord::Base.