【问题标题】:Store constants in Rails在 Rails 中存储常量
【发布时间】:2012-05-24 02:36:48
【问题描述】:

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

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

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

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

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

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

但它给出了错误:

NameError:
       uninitialized constant Provider

【问题讨论】:

标签: ruby-on-rails constants


【解决方案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)

【讨论】:

    【解决方案2】:

    如果你想保留上面的实现

    尝试在Provider::FACEBOOK 前加上一个双冒号

    ::Provider::FACEBOOK
    

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

    更多 Rails 风格

    还有很多其他帖子介绍了常量的放置位置,请查看:

    基本上,将常量放在您真正需要的地方。如果您想在任何地方访问它们,可以在 Controller/Model 或 environment.rb 中。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        相关资源
        最近更新 更多