从 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