Это то, что я в итоге сделал, чтобы заставить все это работать в реальном приложении.Удивительно все, что вошло в эту «простую» функциональность.
Gemfile
gem 'jquery-rails'
gem 'jquery-ui-rails'
gem 'acts_as_list'
Миграция для добавления position
в Active Storage.
class AddPositionToActiveStorageAttachments < ActiveRecord::Migration[5.2]
def change
add_column :active_storage_attachments, :position, :integer, default: 0
end
end
sorting.js
Это позволяет нам сортировать что угодно, используя класс sort-me
.
$(function() {
$(".sort-me").sortable({
update: function(e, ui){
ui.placeholder.height(ui.item.height());
Rails.ajax({
url: $(this).data("url"),
type: "PATCH",
data: $(this).sortable('serialize')
});
}
}).disableSelection();
});
edit.html.erb
Это фрагмент соответствующего кода на странице.Добавление класса sort-me
к содержащему элементу div сделает элементы сортировки из следующего набора элементов.
<div id="product-attachments" class="sort-me" data-url="<%= sort_attachments_admin_products_path %>">
<% @product.images.order(:position).each do |attachment| %>
<div id="<%= dom_id(attachment) %>" class="ui-state-default image-box">
<%= image_tag attachment.variant(combine_options: {auto_orient: true, thumbnail: '200x200^', gravity: 'center', extent: '200x200' }) %>
<%= link_to "Delete", delete_image_admin_products_path(@product.id, attachment.id), method: :delete, class: "btn btn-xs", data: {confirm: "Are you sure?"} %>
</div>
<% end %>
</div>
rout.rb
Это соответствующиемаршруты.В этом случае использовалось пространство имен администратора.Поэтому, если вы используете это без него, убедитесь, что ваши маршруты / пути не включают в себя административную часть.
namespace 'admin' do
resources :products do
collection do
patch '/products/sort/:id', action: :sort_attachments, as: 'sort_attachments'
delete '/products/:id/images/:image_id', action: 'delete_image', as: 'delete_image'
end
end
end
products_controller.rb
Соответствующие действия контроллера для сортировка и удаление маршрутов.
def sort_attachments
params[:attachment].each_with_index do |id, index|
ActiveStorage::Attachment.where(id: id).update_all(position: index + 1)
end
head :ok
end
def delete_image
ActiveStorage::Attachment.where(id: params[:image_id])[0].purge
redirect_to edit_admin_product_path(params[:id]), notice: 'Image was successfully deleted.'
end