从 devise.rb 中的环境变量读取的所有配置的设置 returns nil
Settings returns nil for all configurations which reads from environment variables in devise.rb
我在 Rails 4.2.5 应用程序中使用 config
gem 配置 management。我面临一个奇怪的问题,它看起来像在 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
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 上运行。
编辑
很少有模型还使用配置中的设置来读取环境变量的值。这样的设置也有 nil 值。令人惊讶的是,当我从控制台 (RAILS_ENV=production rails c
)
检查时,所有从环境中读取值的设置都正确设置了值
创建了一个以密钥作为环境变量名称的 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
我在 Rails 4.2.5 应用程序中使用 config
gem 配置 management。我面临一个奇怪的问题,它看起来像在 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
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 上运行。
编辑
很少有模型还使用配置中的设置来读取环境变量的值。这样的设置也有 nil 值。令人惊讶的是,当我从控制台 (RAILS_ENV=production rails c
)
创建了一个以密钥作为环境变量名称的 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