Понедельник, 21 декабря 2020 03:32

Включаем Active Storage и загрузку изображений в Amazon S3. Part 2

Оцените материал
(7 голосов)

Продолжение материала Включаем Active Storage и загрузку изображений в Amazon S3. Реализуем в панели администрирования Active Admin управление изображениями для блога - загрузку и удаление - локально либо на серверах Amazon S3.

Using Ruby on Rails Active Storage image uploads for Active Admin backed resources

 

How to Build an Image Upload Feature with Rails, Active Admin and Active Storage
How to Build an Image Upload Feature with Rails, Active Admin and Active Storage

 

Blog on Rails. Live Demo.

Увидеть на гитхабе.

 

ActiveAdmin.register Slider do
  permit_params :published_at, :name, images: []

  scope :all
  scope :published
  scope :unpublished

  action_item :publish, only: :show do
    link_to 'Publish', publish_admin_slider_path(slider), method: :put unless slider.published_at?
  end

  action_item :unpublish, only: :show do
    link_to 'Unpublish', unpublish_admin_slider_path(slider), method: :put if slider.published_at?
  end

  action_item :delete_images, only: :show do
    link_to 'Delete Images', delete_images_admin_slider_path(slider), method: :delete if slider.images.attached?
  end

  member_action :publish, method: :put do
    slider = Slider.find(params[:id])
    slider.update(published_at: Time.zone.now)
    redirect_to admin_slider_path(slider)
  end

  member_action :unpublish, method: :put do
    slider = Slider.find(params[:id])
    slider.update(published_at: nil)
    redirect_to admin_slider_path(slider)
  end

  member_action :delete_images, method: :delete do
    slider = Slider.find(params[:id])
    slider.images.purge_later
    redirect_to admin_slider_path(slider)
  end

  form do |f|
    f.inputs 'Slider' do
      f.input :name
      f.input :images, as: :file, input_html: { multiple: true }
    end
    f.actions
  end
  show do |t|
    attributes_table do
      if t.images.attached?
          t.images.each do |img|
            span do
              image_tag img.variant(resize_to_limit: [100, 100])
            end
          end
      end
      row :name
      row :created_at
      row :updated_at
      row :published_at
    end
  end
end

 

А если необходимо удалить не все приаттаченные изображения разом, а только одно из них; или же два - три? - чаще всего так ведь и бывает, ряд изображений меняем на новые, что-то оставляем на месте.

Ну вот как-то так, например. Вполне рабочий вариант, хотя и незамысловатый. Удаление одной иллюстрации по клику на ее пиктограмме:

 

  member_action :delete_image, method: :delete do
    slider = Slider.find_by(params[:name])
    slider.images[params[:id].to_i].purge_later
    redirect_to admin_slider_path(slider)
  end

  if t.images.attached?
     t.images.each_with_index do |img, index|
        span do
          link_to delete_image_admin_slider_path(index), method: :delete do
              image_tag img.variant(resize_to_limit: [100, 100])
           end
         end
      end
   end

 
Последнее изменениеСуббота, 02 января 2021 20:48

Оставить комментарий

Добавьте ваш комментарий

Text To Speech

Комментарии в блоге