在Rails中存储常量

时间:2012-05-22 21:58:06

标签: ruby-on-rails constants

我来自Java背景。我想知道是否有办法让一个类存储常量值。

具体到我的问题,我想知道我是否可以拥有类似的东西:

@user.authentications.create(:uid => "12345", :provider => Provider::FACEBOOK)

其中Provider类存储了所有静态常量。另外,这是在Ruby on Rails中执行此操作的正确方法吗?

额外信息: 我试过上面的

class Provider
  FACEBOOK = "facebook"
  TWITTER = "twitter"
end

但它给出了错误:

NameError:
       uninitialized constant Provider

3 个答案:

答案 0 :(得分:1)

选项1(类变量):

class Provider
  @@FACEBOOK = "facebook"
  @@TWITTER = "twitter"
end

@user.authentications.create(:uid => "12345", :provider => Provider.FACEBOOK)

在某些情况下,强烈建议不要使用类变量。更好的方法是使用元伏都教:

class Provider
  @FACEBOOK = "facebook"
  @TWITTER = "twitter"

  class << self
    attr_reader :FACEBOOK, :TWITTER
  end
end

@user.authentications.create(:uid => "12345", :provider => Provider.FACEBOOK)

答案 1 :(得分:0)

如果您希望保持上面的实施

尝试使用双冒号前缀Provider::FACEBOOK

::Provider::FACEBOOK

这设置了一个绝对路径,因此Ruby不会尝试在当前上下文/类/ Controller中查找常量。 (我的假设是现在它认为常量是在UserController::Provider::FACEBOOK

中定义的

更多Rails-esque

关于在哪里放置常量还有很多其他帖子,所以请查看:

基本上,将常量放在实际需要它们的位置。如果您想在任何地方访问它们,请在Controller / Model或environment.rb中。

答案 2 :(得分:0)

如果在模型文件中声明该类,则可以访问该类。如果您在lib文件中声明,那么您在application.rb文件中添加了一行

config.autoload_paths += %W(#{config.root}/lib)