Mit dem b4um Sortable Generator ergänzt du bestehende Datensätze um eine dauerhaft gespeicherte Reihenfolge.
Die Sortierung erfolgt bequem per Drag & Drop – Model, Controller, Route und Stimulus-Logik werden automatisch eingerichtet.
Datensätze mit Sortable per Drag & Drop sortieren
Manchmal reicht es nicht aus, Datensätze nach Name oder Erstellungsdatum zu sortieren. Produkte, Beiträge oder andere Inhalte sollen stattdessen in einer individuell festgelegten Reihenfolge erscheinen.
Der b4um Generator übernimmt dafür die komplette Grundlage. Mit einem einzigen Generator-Aufruf erhält dein bestehendes Model eine Positionsverwaltung und die Index-Seite wird zu einer Drag-&-Drop-Sortieransicht.
In diesem Beispiel verwenden wir ein vorhandenes Product-Model.
Ausgangspunkt
Unsere Anwendung besitzt bereits Produkte und eine normale Produktübersicht. Das Model wurde beispielsweise mit dem b4um Scaffold Generator erstellt:
Die Produkte werden bisher über die normale Index-Ansicht dargestellt.
Hinweis: Sortable wird auf ein bereits vorhandenes Model angewendet. In unserem Beispiel heißt dieses Model Product.
Sortable installieren
Um die Produkte sortierbar zu machen, genügt:
bin/rails generate b4um:sortable Product
Der Generator richtet die benötigten Bestandteile automatisch ein. Unter anderem werden eine Migration für position, die Sortierlogik im Model und Controller, eine PATCH-Route, ein Stimulus Controller sowie das Sortable-Partial erzeugt.
Die vorhandene Index-Seite wird anschließend automatisch auf die Sortieransicht umgestellt.
Bereits vorhandene Datensätze erhalten dabei ihre anfängliche Reihenfolge.
Die neue Sortieransicht
Nach einem Reload von
/products
erscheint anstelle der bisherigen Index-Darstellung die Sortable-Ansicht.
Sortable-Ansicht unmittelbar nach der Installation
Jeder Datensatz besitzt jetzt links seine aktuelle Positionsnummer und einen Drag-Handle.
Die Reihenfolge lässt sich direkt mit der Maus verändern.
Reihenfolge per Drag & Drop ändern
In unserem Beispiel ziehen wir die USB-C Dockingstation von Position 4 ganz nach oben auf Position 1. Aus:
Die Positionsnummern werden dabei automatisch aktualisiert.
USB-C Dockingstation nach dem Verschieben auf Position 1
Die Änderung findet nicht nur im Browser statt. Die neue Reihenfolge wird unmittelbar in der Datenbank gespeichert.
Lädst du /products anschließend neu, bleibt die neue Reihenfolge erhalten.
Was erledigt der Generator im Hintergrund?
Du musst die Sortierlogik nicht selbst programmieren. Der Generator erweitert mehrere Bereiche deiner Rails-Anwendung automatisch.
Im Product-Model wird unter anderem dafür gesorgt, dass ein neu angelegtes Produkt automatisch die nächste freie Position erhält:
Dadurch werden neue Datensätze am Ende einsortiert. Wird ein Datensatz gelöscht, werden die nachfolgenden Positionen wieder zusammengezogen.
Auch die Index-Abfrage wird angepasst:
def index
@products = Product.order(:position, :id)
end
Damit richtet sich die Darstellung nicht mehr nach der Datenbank-ID oder dem Erstellungsdatum, sondern nach der gespeicherten Position.
Sortierung speichern
Zusätzlich ergänzt der Generator eine Collection-Route:
resources :products do
patch :sort, on: :collection
end
Wenn ein Produkt verschoben wird, sendet der Stimulus Controller die neue Position an diese Route.
Der erzeugte sort-Endpunkt prüft die gewünschte Position und aktualisiert innerhalb einer Datenbanktransaktion sowohl den verschobenen Datensatz als auch die betroffenen Datensätze dazwischen.
Du musst dafür weder JavaScript noch eine eigene Sortierlogik schreiben.
Neue Datensätze
Auch nach der Installation von Sortable kannst du ganz normal weitere Produkte anlegen.
Ein neuer Datensatz erhält automatisch die nächste Position und wird damit am Ende der bestehenden Reihenfolgeeingefügt.
Anschließend kannst du ihn per Drag & Drop an die gewünschte Stelle verschieben.
Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren,
Funktionen für soziale Medien anbieten zu können und die Zugriffe auf
unsere Website zu analysieren.
Sie akzeptieren unsere Cookies, wenn Sie fortfahren diese Webseite zu
nutzen.
Datenschutzerklärung.