对于从 devise.rb 中的环境变量读取的所有配置,设置 返回 nil



我在 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

最新更新