Ein kurzes Tutorial zum Basis-Code den ich verwende.
Vorbereitung
Eine einfache Basis-App für unsere Tutorials erstellen
In vielen unserer Rails-Tutorials benötigen wir nur eine kleine Beispielanwendung, um eine bestimmte Funktion auszuprobieren. Damit diese Anwendungen nicht jedes Mal vollkommen ungestaltet aussehen, erstellen wir in diesem Tutorial eine einfache Basis, die wir später auch in anderen Projekten verwenden können. Unsere Basis soll unter anderem einen übersichtlichen Inhaltsbereich, einfache Formularstyles, Validierungsfehler und Flash-Meldungen erhalten. Zum Ausprobieren erstellen wir eine kleine Rails-Anwendung mit einer User-Ressource. Zunächst erstellen wir die Anwendung:
$ rails new basic
$ cd basic
Anschließend erzeugen wir einen Scaffold für unsere Benutzer:
$ rails g scaffold User name:string email:string
Rails hätte bei diesen beiden Attributen auch ohne die explizite Angabe :string String-Spalten erzeugt. Wir schreiben den Typ hier trotzdem aus, damit bereits beim Generator-Aufruf eindeutig erkennbar ist, welche Datentypen wir verwenden.
Danach führen wir die Migration aus:
$ rails db:migrate
Nun starten wir die Anwendung:
$ bin/rails server
Anschließend können wir im Browser die Benutzerübersicht aufrufen:
/users
Über:
/users/new
erreichen wir das vom Scaffold erzeugte Formular zum Erstellen eines neuen Benutzers.
Damit besitzen wir eine vollständige kleine CRUD-Anwendung, die uns als Ausgangspunkt für die weitere Gestaltung dient.
Einen gemeinsamen Seitenbereich verwenden
Den Inhalt in einem Container darstellen
Bevor wir mit dem eigentlichen Styling beginnen, passen wir das Application-Layout an.
Rails verwendet:
app/views/layouts/application.html.erb
als gemeinsames Layout unserer Views.
Innerhalb des <body> legen wir einen main-Bereich mit der Klasse container an:
yield ist die Stelle, an der Rails den Inhalt der jeweils aufgerufenen View einfügt.
Rufen wir beispielsweise:
/users
auf, wird die Benutzerübersicht innerhalb unseres main.container dargestellt.
Dasselbe gilt für:
/users/new
und die übrigen Views unserer Anwendung.
Wir müssen den Container deshalb nicht in jeder einzelnen View erneut anlegen.
1.webp28.5 KB2.webp32.4 KB
Grundlegende Gestaltung
Die Basis-App mit CSS gestalten
Für unsere kleine Basis-App benötigen wir kein zusätzliches Sass-Gem. Das Styling, das wir verwenden möchten, lässt sich vollständig mit normalem CSS umsetzen.
Wir verwenden dafür das vorhandene Stylesheet:
app/assets/stylesheets/application.css
Am Ende der Datei ergänzen wir zunächst die grundlegende Gestaltung unserer Anwendung:
Dadurch bleibt unsere einfache Basis auch auf schmaleren Bildschirmen benutzbar.
Links etwas dezenter gestalten
Die vom Browser vorgegebenen Linkfarben unterscheiden sich je nach Zustand. Für unsere Basis verwenden wir deshalb ein einheitlicheres Erscheinungsbild:
Wir setzen dabei bewusst keine weiße Hintergrundfarbe auf Links. Dadurch funktionieren Links auch außerhalb unseres weißen Containers, ohne einen unerwünschten weißen Hintergrund zu erhalten.
Formulare gestalten
Als Nächstes passen wir die vom Scaffold erzeugten Formulare an.
werden Padding und Rahmen in die angegebene Breite des Eingabefeldes eingerechnet. Dadurch können die Felder nicht allein durch ihr Padding breiter als vorgesehen werden.
Die maximale Breite:
max-width: 600px;
verhindert gleichzeitig, dass kurze Formulareingaben auf großen Bildschirmen unnötig über die gesamte Seite gezogen werden.
Checkboxen und Radio-Buttons sind eine Ausnahme. Sie sollen nicht die vollständige verfügbare Breite einnehmen:
prüft Rails vor dem Speichern, ob für name und email ein Wert vorhanden ist.
Versuchen wir jetzt unter:
/users/new
einen Benutzer ohne Name und E-Mail-Adresse anzulegen, schlägt die Validierung fehl.
Rails speichert den Datensatz nicht und das Formular wird erneut mit den vorhandenen Validierungsfehlern angezeigt.
Bei zwei leeren Feldern erhalten wir beispielsweise die Meldungen:
Name can't be blank
Email can't be blank
Die Validierung gehört dabei in das Model und gilt damit unabhängig davon, über welches Formular oder welchen Controller der Datensatz gespeichert werden soll. 5.webp49 KB
Die vom Scaffold erzeugte Fehlerausgabe
Der Rails-Scaffold erzeugt im Formular bereits eine Fehlerausgabe für fehlgeschlagene Validierungen.
In:
app/views/users/_form.html.erb
finden wir einen Bereich, der nur angezeigt wird, wenn der aktuelle User Fehler enthält.
Wir gestalten diesen Bereich für unsere Basis-App etwas übersichtlicher und verwenden dafür eine eigene CSS-Klasse.
Der Anfang unseres Formular-Partials sieht anschließend so aus:
<!-- app/views/users/_form.html.erb --><%= form_with(model: user) do |form| %><%if user.errors.any? %><divclass="error-messages"><h2><%= pluralize(user.errors.count, "error") %>
prohibited this user from being saved:
</h2><ul><% user.errors.each do |error| %><li><%= error.full_message %></li><%end%></ul></div><%end%><!-- Die übrigen Formularfelder bleiben unverändert. --><%end%>
Wichtig ist dabei:
<% if user.errors.any? %>
Die Fehlerbox wird also nur erzeugt, wenn tatsächlich Validierungsfehler vorhanden sind.
Mit:
<%= pluralize(user.errors.count, "error") %>
wird die Anzahl der vorhandenen Fehler ausgegeben.
Und:
<% user.errors.each do |error| %><li><%= error.full_message %></li><%end%>
Damit erhält die Fehlerausgabe einen roten Rahmen und eine deutlich hervorgehobene Überschrift.
Die eigentlichen Fehlermeldungen bleiben darunter gut lesbar auf einem neutralen Hintergrund.
Da wir:
width: 100%;
max-width: 500px;
verwenden, bleibt die Fehlerbox auf größeren Bildschirmen kompakt, kann sich auf kleineren Bildschirmen aber an den verfügbaren Platz anpassen.
Damit besitzen unsere Formulare eine einheitliche Darstellung für Validierungsfehler, die wir auch in anderen Formularen unserer Tutorials wiederverwenden können. 6.webp42.6 KB
Flash-Meldungen zentral anzeigen
Erfolgs- und Fehlermeldungen im Layout ausgeben
Nach bestimmten Aktionen verwendet Rails Flash-Meldungen, um dem Benutzer eine Rückmeldung zu geben.
Nach dem erfolgreichen Erstellen eines Users setzt der vom Scaffold erzeugte Controller beispielsweise eine Meldung wie:
User was successfully created.
Nach dem Löschen eines Users erhalten wir entsprechend:
User was successfully destroyed.
Der Scaffold gibt solche Meldungen zunächst direkt in einzelnen Views aus. In app/views/users/index.html.erb und app/views/users/show.html.erb kann sich beispielsweise folgende Zeile befinden:
<pstyle="color: green"><%= notice %></p>
Diese Ausgabe entfernen wir aus den einzelnen Views.
Statt Flash-Meldungen auf jeder Seite separat auszugeben, platzieren wir die Ausgabe einmal zentral in unserem Application-Layout.
Dazu ergänzen wir innerhalb unseres Containers und vor <%= yield %>:
<!-- app/views/layouts/application.html.erb --><body><mainclass="container"><% flash.each do |type, message| %><divclass="flash-message flash-<%= type %>"><%= message %></div><%end%><%=yield%></main></body>
Durch:
<% flash.each do |type, message| %>
durchlaufen wir alle für den aktuellen Request vorhandenen Flash-Meldungen.
Der eigentliche Text befindet sich in:
<%= message %>
Zusätzlich verwenden wir zwei CSS-Klassen.
Jede Flash-Meldung erhält:
flash-message
und abhängig von ihrem Typ beispielsweise:
flash-notice
oder:
flash-alert
Dadurch können wir die allgemeine Gestaltung und die verschiedenen Meldungstypen getrennt definieren.
Eine normale Erfolgsmeldung vom Typ notice erhält damit einen grünen Hintergrund.
Eine Meldung vom Typ alert wird dagegen rot dargestellt.
Da die Flash-Ausgabe Bestandteil unseres gemeinsamen Layouts ist, müssen wir sie nicht mehr in jeder einzelnen View wiederholen.
Flash-Meldungen nach dem Erstellen eines Users
Erstellen wir nun einen gültigen User, leitet uns der Scaffold anschließend zur Show-Seite weiter.
Dort erscheint beispielsweise:
User was successfully created.
Die Meldung wird nicht mehr von users/show.html.erb selbst ausgegeben, sondern zentral durch unser Application-Layout. 7.webp39.5 KB
Flash-Meldungen nach dem Löschen eines Users
Dasselbe gilt nach dem Löschen.
Der Scaffold leitet anschließend zurück zur Benutzerübersicht und setzt eine entsprechende Flash-Meldung.
Beispielsweise:
User was successfully destroyed.
Auch diese Meldung wird automatisch an derselben Stelle im Layout dargestellt. 8.webp34 KB
Damit haben wir eine zentrale Flash-Ausgabe, die nicht nur für unsere User-Views funktioniert. Auch andere Controller und Ressourcen unserer Anwendung können dieselbe Darstellung verwenden.
Unsere Basis-App besitzt damit einen gemeinsamen Seitencontainer, grundlegende Formularstyles, eine übersichtliche Darstellung von Validierungsfehlern und eine zentrale Ausgabe von Flash-Meldungen.
Diese Grundlage können wir für weitere kleine Rails-Beispielanwendungen und Tutorials wiederverwenden.
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.