【发布时间】:2020-08-04 22:15:35
【问题描述】:
我正在尝试使用 Rails Active Storage 将照片上传到 S3。
我可以附上一张照片:
user.photo.attach(io: File.open('spec/images/filename.png'), filename: 'filename.png')
我可以保存用户,我可以获取照片服务 url 并在浏览器和我的存储桶中看到它:
user.photo.service_url
但是,如果我重新启动控制台并尝试获取服务 url,我会收到以下错误:
Module::DelegationError (service_url delegated to attachment, but attachment is nil)
这是我的存储桶设置:
storage.yml:
amazon:
service: S3
access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
region: us-east-2
bucket: <%= Rails.application.credentials.dig(:aws, :bucket) %>
应用程序.rb:
config.active_storage.service = :amazon
user.rb:
has_one_attached :photo
我在 storage.yml 文件中使用 public: true 时也遇到了问题。
如果我尝试设置配置,我会收到以下错误:
ArgumentError (Cannot load `Rails.config.active_storage.service`:)
invalid configuration option `:public'
amazon:
service: S3
access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
region: us-east-2
bucket: <%= Rails.application.credentials.dig(:aws, :bucket) %>
public: true
【问题讨论】:
-
你是否也在
config/environments/development.rb和config/environments/production.rb文件中设置了config.active_storage.service = :amazon -
考虑使用
Rails.application.credentials.fetch(:aws).fetch(:access_key_id)而不是dig,如果它在启动时不存在而不是在使用时会引发错误,这对调试非常有帮助。
标签: ruby-on-rails amazon-s3 rails-activestorage