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)
虽然我一般不会推荐它,但您可以通过将字符串传递给以下来访问类变量class_eval
:
Image.class_eval('@@path_to_folder')
Run Code Online (Sandbox Code Playgroud)
至少在Ruby的更高版本中.
但请注意,类变量与子类层次结构中最高级的类相关联.对于像这样的ActiveRecord子类,这意味着这些类变量确实存在于名称空间中ActiveRecord::Base
.
归档时间: |
|
查看次数: |
20323 次 |
最近记录: |