环境变量无法在rails

时间:2017-08-31 13:30:19

标签: ruby-on-rails ruby environment-variables

我尝试使用环境变量在生产环境中配置我的rails应用程序,但我不能让它们工作。

我将它们导出到~/.bashrc这样的

export AWS_ACCESS_KEY_ID=my_key
export AWS_REGION=my_region
export AWS_SECRET_ACCESS_KEY=my_secret_key
export S3_BUCKET_NAME=my_bucket_name
export S3_HOST_NAME=my_host_name

如果我在终端上使用printenv,我可以看到它们。

我在production.rb这样的

中访问它们
config.paperclip_defaults = {
    storage: :s3,
    s3_region: ENV['AWS_REGION'],
    s3_host_name: ENV['S3_HOST_NAME'],
    bucket: ENV['S3_BUCKET_NAME'],
    s3_credentials: {
      access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
    }
 }

使用此配置,当我打开带有图像的链接时,我的应用程序崩溃,说我必须指定一个bucket_name

如果我将它们保存在secrets.yml中并像这样访问它们,它就能完美运行

config.paperclip_defaults = {
      storage: :s3,
      s3_region: Rails.application.secrets.s3_region,
      s3_host_name: Rails.application.secrets.s3_host_name,
      bucket: Rails.application.secrets.s3_bucket_name,
      s3_credentials: {
          access_key_id: Rails.application.secrets.access_key,
          secret_access_key: Rails.application.secrets.secret_access_key,
      }
  }

当我在heroku上部署并通过仪表板进行设置时,环境变量再次运行良好,只有当我通过计算机中的ENV [' key']访问它们时才会崩溃

[编辑]问题出在我的ruby上,我在脚本中添加了-ic来启动它,我解决了问题。谢谢大家

3 个答案:

答案 0 :(得分:3)

您可能希望使用DirEnvDotEnv来加载来自文件的ENV变量。这比使你的个人资料混乱更为理智。

此外,当访问非可选的ENV变量时,请使用ActiveSupport #fetch方法,以便在未设置var时引发错误:

config.paperclip_defaults = {
    storage: :s3,
    s3_region: ENV.fetch('AWS_REGION'),
    s3_host_name: ENV.fetch('S3_HOST_NAME'),
    bucket: ENV.fetch('S3_BUCKET_NAME'),
    s3_credentials: {
      access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
      secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY')
    }
}

这样可以更容易地进行故障排除,因为在启动Rails服务器时会出现错误,而不是在使用env var时稍后爆炸的应用程序。

答案 1 :(得分:1)

简单我们需要在应用程序中创建.env文件

在您的gem文件中添加gem 'dotenv-rails', '~> 2.7', '>= 2.7.2'

bundle install

在您的application.rb文件中添加

Dotenv::Railtie.load

重新启动服务器rails s

就这样,.env文件中使用简单的常量

DEVELOPMENT_URL = http://localhost:3000/

在该应用程序中的任何位置添加该常量

例如:

def index
  redierct_to DEVELOPMENT_URL
end

答案 2 :(得分:0)

我建议您使用Rails dotenv library并将自定义需求变量放在.env文件中,而不是在系统范围内放置env变量。因此,我们可以使env变量对于只有应用程序而不是系统范围保密。