Я пытаюсь использовать Active Storage с Amazon Web Services вместо Carrierwave и Cloudinary.
С Carrierwave у меня были некоторые функции, которые позволяют изменять размер изображений перед загрузкой через UploaderController.
Но как это сделать с Active Storage?
Я пробую это:
Gemfile:
gem 'aws-sdk-s3', require: false
gem 'image_processing', '~> 1.2'
gem 'mini_magick', '~>4.9'
item.rb
class Item < ApplicationRecord
has_one_attached :photo
end
На мой взгляд, у меня есть форма:
<%= f.input :photo, input_html: { accept: ('image') } %>
Я получаю этот объект как фото:
#<ActiveStorage::Attached::One:0x00005641d296e1b8 @name = "photo", @record=#<Item id: nil, name: "test0941", verbe: "To Lend", collection_id: nil, created_at: nil, updated_at: nil, price_cents: 0, description: "", category_id: 78, photo: nil>, @dependent=:purge_later>
И в моем контроллере:
@item = Item.new(item_params)
@item.photo.combine_options do |b|
b.resize "250x200>"
end
Я не могу изменить размер фотографии методами MiniMagick gem.
Есть ли у кого-нибудь идеи для этого?
Спасибо за вашу помощь, Тибо
Если params [: item] [: photo] - это параметр из вашего сообщения, вы можете добавить
image = MiniMagick::Image.new(params[:item][:photo].tempfile.path)
image.resize "250x200>"
Мне нужна была контекстная информация, чтобы это работало. Эти две строки должны быть в контроллере, в действии создания и / или обновления. Сначала определите свой объект как обычно, например @obj = Obj.new(params[:id])
, если это действие create. Затем добавьте две строчки в этот ответ. Если в вашей модели есть has_many_attached
, вам нужно пройти через params[:object][:attachment]
или что-то еще, что у вас есть. Наконец просто сохраните объект!
У Active Storage есть решение вашей проблемы. Вам не нужно изменять размер изображений в вашем контроллере, вы можете просто использовать его как item.photo.variant (resize: '100x100') в вашем файле просмотра. Active Storage создаст новые варианты образов, как по волшебству.
https://edgeguides.rubyonrails.org/active_storage_overview.html
Это хорошее решение для небольших сайтов, но когда ваш сайт начнет расти, это может стать плохой идеей. Более подходящий подход может быть изменен во многих версиях перед сохранением, а затем в каждом случае используется соответствующий.
Это работает, но в моем случае мне пришлось удалить: photo из item_params, применить описанную выше логику, а затем прикрепить фотографию с помощью @ item.photo.attach (params [: item] [: photo]).