0

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

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

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

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

额外信息: 我尝试了上述方法

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

但它给出了错误:

NameError:
       uninitialized constant Provider
4

3 回答 3

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)
于 2012-05-22T22:05:25.283 回答
0

如果您想保留上面的实现

尝试Provider::FACEBOOK用双冒号作为前缀

::Provider::FACEBOOK

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

更多 Rails 风格

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

基本上,把常量放在你真正需要的地方。无论是在控制器/模型中,还是在environment.rb您想在任何地方访问它们时都可以。

于 2012-05-22T22:32:39.840 回答
0

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

config.autoload_paths += %W(#{config.root}/lib)
于 2012-05-23T18:36:48.710 回答