我一直在尝试(不成功)从我的Rails可安装引擎中访问主应用程序的应用程序机密。 可安装引擎的重点是提供模块化。因此,一个常见的模式是在主应用程序中提供可配置的参数,其中一些需要保密,然后由引擎使用。
在我的具体情况下,我在我的引擎中使用carrierwave和fog将文件上传到AWS桶。确切的存储桶和AWS凭据未在引擎中指定,但在主应用程序中指定,因为它们会因安装引擎的应用程序而异。
然而,当安装在引擎中时,carrierwave的初始化程序失败,因为它无法找到主应用程序的Rails.application.secrets:
require 'carrierwave'
require 'carrierwave/storage/fog'
CarrierWave.configure do |config|
config.fog_provider = 'fog/aws'
config.fog_credentials = {
:provider => 'AWS',
:aws_access_key_id => Rails.application.secrets.S3_AWS_ACCESS_KEY_ID,
:aws_secret_access_key => Rails.application.secrets.S3_AWS_SECRET_ACCESS_KEY
}
config.fog_directory = Rails.application.secrets.CARRIERWAVE_CONFIG_FOG_DIRECTORY
config.storage = :fog
end
使用
启动引擎时失败Missing required arguments: aws_access_key_id, aws_secret_access_key (ArgumentError)
实际上Rails.application.secrets.S3_AWS_ACCESS_KEY_ID
(和其他人)在初始值设定项中评估为nil
。一旦应用程序运行,它会在引擎控制器内正确评估,但在初始化程序中它是零。
我修改了以下内容:
:aws_access_key_id => Rails.application.secrets.S3_AWS_ACCESS_KEY_ID || ENV["S3_AWS_ACCESS_KEY_ID"]
并在每个生产环境中导出ENV VARIABLE以供引擎使用,但这不太理想。任何解决方案将不胜感激。