问题描述
对于一个学校项目,我正在开发一个“出售”小猫照片的Rails应用程序。我在线上挑选了10张猫的图片,它们目前在我的计算机上。我正在为数据库使用Postgresql。我有一个代表小猫照片的类/模型Item
。
我正在寻找一种方法,当通过seeds.rb
循环生成虚假数据时,将小猫照片附加到每个Item
类/模型上,然后将其存储到AWS S3已经创建的存储桶(称为 catz-temple )。我在.env
文件上有两个访问权和S3秘密密钥,我已经像这样修改了storage.yml
文件:
amazon:
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
region: eu-central-1
bucket: catz-temple
我发现有一个名为aws-sdk-ruby
的瑰宝,但我只是找不到关于该主题的方法。
目前,我只是将我的存储桶公开访问并获取每个存储桶照片的网址,但是对此没有任何API和安全方法...
谢谢大家
解决方法
首先遵循configuring ActiveStorage and S3的指南。然后在模型上设置附件。
class Kitteh < ApplicationRecord
has_one_attached :photo
end
使用ActiveStorage,您可以通过传递IO对象来directly attach files to records:
photos = Rails.root.join('path/to/the/images','*.{jpg,gif,png}')
100.times do |n|
path = photos.sample
File.open(path) do |file|
Kitteh.new(name: "Kitteh #{n}") do |k|
k.photo.attach(
io: file,filename: path.basename
)
end.save!
end
end
此示例创建100条记录,并从硬盘驱动器的目录中选择一个随机映像,并将其上传到您已配置的存储中。