我尝试使用环境变量在生产环境中配置我的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来启动它,我解决了问题。谢谢大家
答案 0 :(得分:3)
您可能希望使用DirEnv或DotEnv来加载来自文件的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变量对于只有应用程序而不是系统范围保密。