首页 > 解决方案 > 使用载波时如何在模型上设置“fog_public”值?

问题描述

我正在使用带有carrierwave gem的rails来上传文件。问题是客户希望这些文件必须具有is_public属性,这将决定文件上传是否可读(S3 存储)。

我现在的解决方案是在 S3 上设置 2 个文件夹来存储并为公共文件夹设置可读性。

image_uploader.rb

  def store_dir
    if self.model.is_public
      "images/public/#{model.id}"
    else
      "images/private/#{model.id}"
    end
  end

S3 上的存储桶策略文件

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my_bucket/images/public/*"
        }
    ]
}

config/initializers/config/initializers/carrierwave.rb

  config.fog_public = false

但我不想每次都配置 S3 Bucket Policy,因为我的产品会卖给很多客户。我只想根据 image_uploader.rb文件中的is_public值设置fog_public属性配置,如下所示:

image_uploader.rb

before_save :set_is_public

private

def set_is_public
  fog_public = self.model.is_public 
end

它有什么办法吗?谢谢你。

标签: ruby-on-railsamazon-s3carrierwave

解决方案


到目前为止我的解决方案是

image_uploader.rb

  before :store, :set_is_public

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

但问题是当我编辑 is_public 属性时,无法调用此回调


推荐阅读