我在 Rails 4.2.5 应用程序中使用 config
gem 进行配置管理。我面临着一个奇怪的问题,它看起来像在devise.rb
后加载了配置,因此无法从settings.yml
中读取一些环境变量中找到任何配置。
这是application.rb
配置
require File.expand_path('../boot', __FILE__)
require 'rails/all'
Bundler.require(*Rails.groups)
module Magnificent
class Application < Rails::Application
Config::Integration::Rails::Railtie.preload
end
end
devise.rb
Devise.setup do |config|
config.omniauth :twitter, Settings.twitter.consumer_key, Settings.twitter.consumer_secret, strategy_class: OmniAuth::Strategies::Twitter
config.omniauth :facebook, Settings.facebook.app_id, Settings.facebook.app_secret , { info_fields: 'email,first_name,last_name' , scope: 'email,public_profile' }
end
设置.yml
twitter:
consumer_key: <%= ENV['TWITTER_CONSUMER_KEY'] %>
consumer_secret: <%= ENV['TWITTER_CONSUMER_SECRET'] %>
facebook:
app_id: <%= ENV['FACEBOOK_APP_ID'] %>
app_secret: <%= ENV['FACEBOOK_APP_SECRET'] %>
附言这在开发环境中完美运行。此外,当我在生产中从控制台访问Settings.twitter.consumer_key
时,它会显示值。
该应用程序在乘客 5.0.25 上运行。
编辑很少有模型还使用从环境变量中读取值的配置中的设置。此类设置也具有 nil 值。令人惊讶的是,当我从控制台(RAILS_ENV=production rails c
)检查时,所有这些从环境中读取值的设置都正确设置了值
创建了一个 yml 文件,其中 key 作为环境变量名称。然后在 application.rb 中的模块声明之前添加了环境变量
require 'rails/all'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
if Rails.env.production?
config_file = '/srv/shared_filesystem/pdf-config.yml'
if File.exists?(config_file)
config = YAML.load(File.read(config_file))
config.each do |key, value|
ENV[key] ||= value.to_s unless value.kind_of? Hash
end
else
raise 'Missing required configuration file /srv/shared_filesystem_ro/pdf-config.yml'
end
end
module MyApp
class Application < Rails::Application
.. ..
.. ..
end
end