Я использую рельсы с carrierwave gem для загрузки файла. Проблема в том, что клиент хочет, чтобы эти файлы имели атрибут is_public , и этот файл решит, может ли загружаемая загрузка быть доступной для чтения или нет (S3 сохранен).
Мое решение теперь состоит в том, чтобы настроить 2 папки на S3 для хранения и настройки для чтения для public .
image_uploader.rb
def store_dir
if self.model.is_public
"images/public/#{model.id}"
else
"images/private/#{model.id}"
end
end
Файл политики Bucket на S3
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/images/public/*"
}
]
}
конфиг / Инициализаторы / конфигурации / Инициализаторы / carrierwave.rb
config.fog_public = false
Но я не хочу настраивать S3 Bucket Policy каждый раз, потому что мой продукт будет продаваться многим покупателям. Я просто хочу настроить атрибут атрибута fog_public в зависимости от значения is_public в моем файле image_uploader.rb , например:
image_uploader.rb
before_save :set_is_public
private
def set_is_public
fog_public = self.model.is_public
end
Есть ли способ сделать это? Спасибо.