【问题标题】:Where's the best place to define a constant in a Ruby on Rails application?在 Ruby on Rails 应用程序中定义常量的最佳位置在哪里?
【发布时间】:2010-11-09 14:48:16
【问题描述】:

在 Ruby on Rails 应用程序中,哪里是定义常量的最佳位置?

我有一个常量数据数组,我需要在我的应用程序中的所有控制器中使用这些数据。

【问题讨论】:

    标签: ruby-on-rails ruby constants


    【解决方案1】:

    您可以将它们放在 config/environment.rb 中:

    Rails::Initializer.run do |config|
        ...
        SITE_NAME = 'example.com'
    end
    

    如果您有大量的全局常量,这可能会很混乱。考虑从 YAML 文件中获取,或将常量保存在数据库中。

    编辑:

    weppos 的答案是更好的答案。

    将常量保存在 config/initializers/*.rb 的文件中

    【讨论】:

      【解决方案2】:

      Rails >= 3,应用程序本身就是一个模块(位于config/application.rb)。您可以将它们存储在应用程序模块中

      module MyApplication
        SUPER_SECRET_TOKEN = "123456"
      end
      

      然后使用MyApplication::SUPER_SECRET_TOKEN 来引用常量。


      Rails >= 2.1 &&

      1. /config/initializers 当常量具有应用程序范围时
      2. 当常量引用特定的模型/控制器/帮助器时,您可以在类/模块本身内限定它

      在 Rails 2.1 和 initializers 支持之前,程序员习惯于将应用程序常量放在 environment.rb 中。

      这里有几个例子

      # config/initializers/constants.rb
      SUPER_SECRET_TOKEN = "123456"
      
      # helpers/application_helper.rb
      module ApplicationHelper
        THUMBNAIL_SIZE= "100x20"
      
        def thumbnail_tag(source, options = {})
          image_tag(source, options.merge(:size => THUMBNAIL_SIZE)
        end
      
      end
      

      【讨论】:

      • 奇怪,但不起作用。虽然 constants.rb 在启动时执行,但我无法在控制器或视图中访问 SUPER_SECRET_TOKEN。
      • 现在这很有趣。谁知道这些常量的“大写”是在 rails 中强制执行的?
      • 注意:创建新常量后不要忘记重启服务器。否则将无法正常显示!
      • @NikitaRybak 这不是因为 Rails,而是 Ruby 语言的要求。
      • 感谢您的回答!这仍然是 Rails 6 的最佳方法吗?另一个答案建议config.xstackoverflow.com/a/34053451/144088
      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2015-03-02
      相关资源
      最近更新 更多