Lesbare URLs mit dem b4um Generator

Lesbare URLs mit dem b4um Generator

Rails verwendet für Datensätze standardmäßig die ID in der URL.
Ein Projekt mit der ID 1 wäre beispielsweise unter folgender Adresse erreichbar:
/projects/1
Mit dem b4um Generator können bereits beim Erstellen eines Scaffolds lesbare URL-Parameter erzeugt werden.
Aus einer einfachen URL wie
/projects/1
wird dann zum Beispiel:
/projects/1-meine-erste-website
Die Datenbank-ID bleibt dabei Bestandteil der URL. Zusätzlich wird ein ausgewähltes Attribut – beispielsweise der Name eines Projekts – für den lesbaren Teil der URL verwendet.

Scaffold mit lesbarer URL erstellen

Für dieses Beispiel erstellen wir ein neues Project-Scaffold mit einem Namen und einer Beschreibung.
Der Name soll gleichzeitig für die lesbare URL verwendet werden.
Dazu verwenden wir die Option --param=name:
bin/rails generate b4um:scaffold Project name:string description:text --param=name
Der b4um Generator erstellt wie gewohnt das vollständige Scaffold und ergänzt zusätzlich die Unterstützung für den lesbaren URL-Parameter.
Anschließend führen wir die Migration aus:
bin/rails db:migrate

Was erzeugt –param?

Durch
--param=name
ergänzt der b4um Generator das Model um eine to_param-Methode.
In unserem Beispiel befindet sich anschließend in:
app/models/project.rb
folgender Code:
class Project < ApplicationRecord
  def to_param
    "#{id} #{name}".parameterize
  end
end
Rails verwendet to_param, wenn eine URL für einen Datensatz erzeugt wird.
Dabei werden die ID und der Name miteinander kombiniert und anschließend mit parameterize in eine URL-taugliche Form gebracht.
Aus:
ID:   1
Name: Meine erste Website
wird:
1-meine-erste-website

Ein Projekt erstellen

Jetzt öffnen wir die Projects-Seite und erstellen ein neues Projekt.
Zum Beispiel:
Name:
Meine erste Website

Description:
Ein Beispielprojekt zum Testen lesbarer URLs mit dem b4um Generator.
Nach dem Speichern öffnet Rails die Show-Seite des neuen Projekts.
Die URL lautet jetzt nicht nur:
/projects/1
sondern:
/projects/1-meine-erste-website

Der Screenshot zeigt gleichzeitig den Projektnamen „Meine erste Website“ und die daraus erzeugte lesbare URL.
Der Screenshot zeigt gleichzeitig den Projektnamen „Meine erste Website“ und die daraus erzeugte lesbare URL.

Warum bleibt die ID erhalten?

Der b4um Generator entfernt die Datenbank-ID nicht.
Das ist bewusst so.
Die URL enthält weiterhin:
1
und ergänzt lediglich den lesbaren Namen:
1-meine-erste-website
Dadurch bleibt der Datensatz eindeutig identifizierbar.
Der lesbare Teil verbessert gleichzeitig die Verständlichkeit der URL.
Statt:
/projects/1
erhält man beispielsweise:
/projects/1-meine-erste-website

Die URL ändert sich automatisch

Der lesbare Teil der URL wird nicht als eigener Wert gespeichert.
Er wird aus dem aktuellen Wert des gewählten Attributes erzeugt.
Das können wir einfach testen.
Wir bearbeiten unser Projekt und ändern den Namen von:
Meine erste Website
zu:
Meine neue Website
Nach dem Aktualisieren des Projekts lautet die URL:
/projects/1-meine-neue-website
Die ID ist weiterhin dieselbe:
1
Nur der aus dem Namen erzeugte Teil hat sich geändert.

2.webp 75.2 KB

In der Browser-Adresszeile sollte sichtbar sein:
localhost:3000/projects/1-meine-neue-website
Auf der Seite ist gleichzeitig der neue Name zu sehen:
Meine neue Website
Damit lässt sich sehr gut erkennen, dass die URL automatisch aus dem aktuellen Namen erzeugt wird.

Andere Attribute verwenden

name ist nur ein Beispiel.
Die Option --param kann mit einem geeigneten Attribut des Scaffolds verwendet werden.
Bei einem Artikel könnte beispielsweise der Titel verwendet werden:
bin/rails generate b4um:scaffold Article title:string body:text --param=title
Ein Artikel mit
ID:    17
Title: Mein erster Artikel
kann dadurch eine URL wie diese erhalten:
/articles/17-mein-erster-artikel
Bei einem Product könnte entsprechend der Name verwendet werden:
bin/rails generate b4um:scaffold Product name:string description:text price:decimal --param=name
Aus:
MacBook Pro
könnte dann beispielsweise werden:
/products/1-macbook-pro

Sonderzeichen und Leerzeichen

Rails übernimmt mit parameterize die Aufbereitung des Wertes für die URL.
Ein Name wie:
Meine neue Website
wird beispielsweise zu:
meine-neue-website
Leerzeichen werden damit automatisch durch Bindestriche ersetzt und der Wert wird für die Verwendung innerhalb der URL aufbereitet.
Man muss dafür keine eigene Slug-Logik schreiben.

Zusammenfassung

Mit der Option
--param=ATTRIBUTE
kann der b4um Scaffold Generator direkt lesbare URLs erzeugen.
Für unser Project haben wir verwendet:
bin/rails generate b4um:scaffold Project name:string description:text --param=name
Dadurch wurde aus der normalen Rails-URL:
/projects/1
eine besser lesbare URL:
/projects/1-meine-erste-website
Nach der Änderung des Namens wurde daraus automatisch:
/projects/1-meine-neue-website
Die Datenbank-ID bleibt dabei erhalten und der lesbare Teil wird automatisch aus dem ausgewählten Attribut erzeugt.
Damit lassen sich bereits beim Erstellen eines b4um Scaffolds verständlichere URLs verwenden, ohne dafür eine zusätzliche Slug-Bibliothek oder ein weiteres Gem installieren zu müssen.

Meld dich an und schreibe ein Kommentar