Как установить значение «fog_public» на модели при использовании carrierwave? - PullRequest
0 голосов
/ 05 июля 2018

Я использую рельсы с 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

Есть ли способ сделать это? Спасибо.

1 Ответ

0 голосов
/ 05 июля 2018

Мое решение до сих пор

image_uploader.rb

  before :store, :set_is_public

  def set_is_public file
    self.fog_public = self.model.is_public
  end

но проблема в том, что когда я редактирую атрибут is_public, этот обратный вызов не может быть вызван

...