Carrierwave Fog AWS S3 не показывает созданные AJAX изображения Rails 5.2 Производство + Разработка - PullRequest
0 голосов
/ 12 марта 2019

Я недавно установил корзину S3 для хранения фотографий / видео для моего приложения Rails 5.2.Я имею в виду, что carrierwave больше не показывает изображения, созданные с помощью сообщений AJAX, а обычные формы также не работают, чтобы сохранить и получить изображения.Пост AJAX будет создан, но в теле будет отображаться только текст.Как я могу успешно создавать сообщения с AJAX / изображениями, хранящимися в AWS S3?

Gemfile (заказ)

gem 'fog-aws', '~> 3.3', group: :production
gem 'carrierwave'
gem 'carrierwave-bombshelter'
gem 'carrierwave-video'

gem 'carrierwave-video-thumbnailer'

S3 Bucket Policy

{
    "Version": "2012-10-17",
    "Id": "Policy2555",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::jim-s3-bucket/*"
        }
    ]
}

carrierwave.rb

module CarrierWave
  module MiniMagick

     # check for images that are larger than you probably want
    def validate_dimensions
      manipulate! do |img|
        if img.dimensions.any? {|i| i > 8000}
          raise CarrierWave::ProcessingError, "dimensions too large"
        end
        img
      end
    end

    def quality(percentage)
      manipulate! do |img|
        img.write(current_path) {self.quality(percentage)}
    img = yield(img) if block_given?
    img
      end
    end
 end

  if Rails.env.test? || Rails.env.development?
    CarrierWave.configure do |config|
      config.storage = :file
      config.enable_processing = false if Rails.env.test?
      config.root = "#{Rails.root}/tmp"
      config.cache_dir = "#{Rails.root}/tmp/images"
    end
  end

  if Rails.env.production?
    CarrierWave.configure do |config|
      config.fog_provider = 'fog/aws'
      config.fog_credentials = {
          # Configuration for Amazon S3
          :provider              => 'AWS',
          :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
          :aws_secret_access_key => ENV['S3_SECRET_KEY'],
          :region                => ENV['S3_REGION'],
      }
      config.fog_directory     =  ENV['S3_BUCKET']
      config.fog_attributes = { cache_control: "public, max-age=#{365.days.to_i}" }
      config.cache_storage = :fog
      config.fog_public = true
      config.cache_dir = "#{Rails.root}/tmp/uploads"
    end
  end
end

create.js.erb

$("#container_posts").prepend("<%= j render partial: "posts/#{@post.post_type}", locals: {post: @post } %>");
$("#post_<%= @post.id %>").hide().fadeIn(1000);

posts_controller.rb

  def create
    @post = current_user.posts.build(posts_params)

    respond_to do |format|
      if @post.save
        format.html {redirect_to posts_path}
        format.js
      end
   end

post_photo_uploader.rb

class PostPhotoUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick
  include CarrierWave::BombShelter
  process :validate_dimensions

  # Choose what kind of storage to use for this uploader:
  # storage :fog


  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Create different versions of your uploaded files:
  version :preview_thumb do
    process :resize_to_fit => [500, 600]
    process :quality => 100
  end

  version :large do
    process :resize_to_fit => [800, 600]
    process :quality => 100
  end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(jpg jpeg gif png)
  end
end
...