ruby-on-rails - 从 Controller (Rails 3)中的 application.rb 访问配置

标签 ruby-on-rails ruby ruby-on-rails-3

我正在尝试向我的 application.rb 添加两个额外的配置选项,以便我可以在 Controller 中读取它们。

# Extra
config.twitter.key = 'foo'
config.twitter.secret = 'bar'

我正在尝试使用三种建议的方法访问它们:

self.config.twitter.key # Should be extended through ApplicationController Base
config.twitter.key # Inherited but with different syntax
CONFIG['twitter']['key'] #some massive magical array that apparently exists somewhere

当我通过“调试”方法传递它们时,它们都会给我不同类型的错误,例如:

debug self.config.twitter.key # undefined method `key' for nil:NilClass

那么,这是怎么回事?

最佳答案

我相信您对 config/application.rb 提供给您的期望背后的想法有点不正确。 ActiveRecord::Base 和 ActiveController::Base 特征类使用在 config/application.rb 中配置的 Rails::Application::Configuration 类。这些属性在从任一基类及其特征类派生的类中不可用。这就是您在 ApplicationController 中遇到错误的原因。

通常有两种方法可以在 Rails 应用程序中进行配置初始化。第一种方法是创建一个配置模块,然后通过初始化程序将值加载到其中:

首先,创建一个 Twitter Config 模块:

#lib/twitter_config.rb
module TwitterConfig
  def self.config
    @@config ||= {}
  end

  def self.config=(hash)
    @@config = hash
  end
end

创建 YAML 配置文件:

# config/twitter.yaml
development: &base
  key: "foo"
  secret: "bar"

test:
 <<: *base
 key: "foo2"

production:
  <<: *base
  secret: "barbar"

或者,如果您不打算将 config/twitter.yaml 添加到您的 SCM,则可以跳过此步骤并通过环境变量设置 key 和 secret 。对于在 Heroku 上部署了公共(public) SCM 存储库的应用程序,这将是建议的解决方案。

然后通过初始化器加载并设置值:

#config/initializers/01_twitter.rb
require 'twitter_config'

TwitterConfig.config = YAML.load_file("config/config.yml")[Rails.env].symbolize_keys

通常最好的做法是为初始化文件编号,因为 Rails 会根据文件名按顺序加载它们。如果您正在初始化数据存储并且这对其他步骤至关重要,那么它需要最小的数字。或者,如果您使用环境变量,这将是初始化文件:

#config/initializers/01_twitter.rb
require 'twitter_config'

TwitterConfig.config[:key] = ENV['twitter_config_key']
TwitterConfig.config[:secret] = ENV['twitter_config_secret']

在整个 Rails 应用程序中,您现在可以使用 TwitterConfig.config[:key] & TwitterConfig.config[:secret] 访问配置值。您也可以包含该模块,只是要注意冲突。

您也可以只将值加载为全局常量。不过我觉得有点难看:

#config/application.rb
TWITTER_CONFIG = YAML.load_file("config/twitter.yaml")[Rails.env]

关于ruby-on-rails - 从 Controller (Rails 3)中的 application.rb 访问配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4143638/

相关文章:

ruby-on-rails - 回形针:无法附加 XLS(但 DOC 可以)

ruby-on-rails - rails : conditional home link

ruby - 如何从 ruby​​ 文件中运行命令行命令?

ruby-on-rails - 如何在相同的两个表之间建立多个多对多关系

ruby-on-rails-3 - 在 Mac OS X Lion 上安装 rails 3.1 时找不到文件 'lib'

ruby-on-rails - Ruby 调试器安装错误

ruby-on-rails - 在私有(private) Controller 方法中返回 redirect_to

javascript - 在 jQuery 中处理 JSON 和 HTML 模板

ruby-on-rails - 为什么我不能安装 SQLite gem?

ruby-on-rails-3 - Heroku Cedar 堆栈和 Rails 3.1 RC5 不显示图像?