我在Rails 4.2.5应用程序中使用config
gem进行配置管理。我面临一个奇怪的问题,它看起来像devise.rb
之后的配置加载,因此无法在生产中找到来自settings.yml
的任何配置读取一些环境变量。
这是application.rb
config
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
settings.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'] %>
P.S。这在开发环境中完美运行。此外,当我从生产中的控制台访问Settings.twitter.consumer_key
时,它会显示值。
该应用程序在Passenger 5.0.25上运行。
修改
很少有模型也使用配置中的设置来读取环境变量中的值。此类设置也具有零值。令人惊讶的是,当我从控制台(RAILS_ENV=production rails c
)
答案 0 :(得分:0)
使用key作为环境变量名创建了一个yml文件。然后在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