Я недавно установил корзину 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