Das erste Mal, als ich Ruby on Rails kennenlernte, war ich ziemlich hin und weg. Es war das erste Programmier-Framework, das ich lernte, und ich muss sagen, dass ich mich irgendwie verliebt habe. Ich hatte gerade gelernt, wie man mit Sinatra Anwendungen erstellt, und hielt es für ein ziemlich geniales Werkzeug, aber dann sah ich, was Rails alles kann…
Eine der Hauptfunktionen von Rails, die ich wirklich gerne benutzte, waren die From Helpers. Sie ermöglichten es mir, den ganzen HTML-Code für die Erstellung eines Formulars zu vermeiden, was mir wiederum die Möglichkeit gab, komplexere Funktionen zu erstellen. In diesem Artikel werde ich die verschiedenen Formular-Helfer in Rails aufschlüsseln und sogar auf einen neuen Helfer eingehen, der in der Version 5.1 von Rails eingeführt wurde.
Formulare mit HTML zu erstellen, kann manchmal lästig sein, besonders wenn sie besonders lang sind und zu viele Eingabefelder enthalten. Noch schwieriger wird es, wenn das Formular Daten an einen bestimmten API-Endpunkt senden oder mit einem Datenbankmodell verknüpft werden soll. Hier ist ein HTML-Formular zum Anlegen eines Benutzers:
<form class="new_user" action="/users" method="post">
<label for="user_name">Name</label>
<input type="text" name="user">
<br>
<label for="user_password">Password</label>
<input type="password" name="user">
<br>
<input type="submit" name="commit" value="Create User" data-disable-with="Create User">
</form>
Wie Sie sehen, kann das Schreiben all dessen ziemlich schnell komplex werden. Wenn Sie sich das Formular genau ansehen, können Sie erkennen, dass wir ein Aktions- und Methodenattribut an unser Formular übergeben, um einen neuen Benutzer zu erstellen. Das ist ja schön und gut, aber Rails ist sehr wählerisch, wenn es um die Übermittlung von Formularen geht. Dieses spezielle Formular würde es nicht schaffen, abgeschickt zu werden.
Form Helpers
Als ich zum ersten Mal lernte, wie man Form Helpers benutzt, konnte ich ehrlich gesagt nicht glauben, was sie können. Wie Sie bei dem vorigen Formular gesehen haben, braucht es einige Zeit und Komplexität, um dies zu erreichen. Mit Formularhelfern kann dies jedoch mit viel weniger Arbeit und mit ein wenig „Magie“ erreicht werden.
Es gibt drei verschiedene Helfer, die uns helfen, schnelle und nützliche Formulare in Rails zu erstellen, form_tag
, form_for
und form_with
. Der letzte, form_with
, wurde mit der Veröffentlichung von Rails 5.1 eingeführt und kombiniert im Wesentlichen die ersten beiden Helfer.
form_tag
Der form_tag
ist der einfachste Helfer und erledigt weniger „Magie“ für dich. Es wird immer noch das Formular für Sie erstellen, aber Sie müssen expliziter sein, wenn Sie die URL-Pfade deklarieren, und es wird hauptsächlich verwendet, wenn das Formular nicht mit einer Controller#Action verbunden ist. Nehmen wir ein einfaches Suchformular als Beispiel:
<%= form_tag("/search", method: "get") do %>
<%= label_tag(:q, "Search for:") %>
<%= text_field_tag(:q) %>
<%= submit_tag("Search") %>
<% end %>
Das erzeugt folgenden HTML-Code:
<form accept-charset="UTF-8" action="/search" method="get">
<input name="utf8" type="hidden" value="✓" />
<label for="q">Search for:</label>
<input name="q" type="text" />
<input name="commit" type="submit" value="Search" />
</form>
Wie Sie sehen können, deklarieren wir die Route, die die Formularparameter in der form_tag
übergeben werden sollen. Sie können sehen, dass dies in der Zeile <%= form_tag("/search", method: "get") do %>
geschieht, und Sie können auch sehen, dass wir die http-Anfrage angeben. Das ist immer noch ziemlich genial und du kannst sehen, dass Rails sich um eine Menge für uns kümmert, sogar in der grundlegenden Formularhilfe, aber Rails hat eine mächtigere Version davon…
form_for
Form_for ist das einzig Wahre. Dieser Helfer erlaubt es uns, ein Formular an ein Objekt zu binden, wodurch wir ein Objekt erstellen/bearbeiten können. Wie wir im form_tag
-Beispiel gesehen haben, mussten wir explizit angeben, welcher URL-Pfad für die Übermittlung der Formularparameter zu verwenden ist, aber form_for
erlaubt uns, dies zu abstrahieren. Hier ein Beispiel:
<%= form_for @user do |f| %> <%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.submit %><% end %>
Damit wird derselbe Code erzeugt, den wir in unserem ersten Beispiel für ein HTML-Formular gesehen haben.
<form class="new_user" action="/users" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓">
<input type="hidden" name="authenticity_token"
value="QPJXa5iS/XNvodHhpcwV5q42RoGFWsmZkwL3ATHFfeKqxZ8IQsLs1QjJvcrdO3BwCaOfQ4TxNLDD0b6VbxiACg=="> <label for="user_name">Name</label>
<input type="text" name="user">
<br>
<label for="user_password">Password</label>
<input type="password" name="user">
<br>
<input type="submit" name="commit" value="Create User" data-disable-with="Create User"></form>
Sie können sofort sehen, wie viel sauberer dieser Code mit form_for
aussieht. Ehrlich gesagt ist es ein wenig erstaunlich, dass ein so kleiner Code so viel HTML erzeugen kann, aber er tut es wirklich! In der ersten Zeile von form_for
sehen Sie, dass wir eine Instanzvariable des Benutzers übergeben, die dieses Formular mit diesem Objekt verknüpft. Die andere coole Sache an der Übergabe dieser Variable ist, dass Rails von sich aus nach dem passenden URL-Pfad sucht, im Vergleich zu form_tag
, wo wir explizit sagen mussten, wohin die Daten gesendet werden sollen.
form_with
- Vielleicht über form_with und seine Verwendung sprechen
- Code-Schnipsel als Beispiel verwenden
Wenn man sich die Ruby on Rails 5.1 Release Notes anschaut, gibt es einen Hinweis, dass form_for und form_tag in form_with vereint werden. Der größte Vorteil dieses neuen Helfers ist, dass er form_with
Form-Tags basierend auf URLs, Scopes oder Models generieren kann
Lassen Sie es uns ausprobieren!
form_with using URLs
Lassen Sie uns das gleiche Beispiel verwenden, das wir in form_for
benutzt haben, und es mit form_with
unter Verwendung einer einfachen URL anwenden:
<%= form_with url: user_path do |f| %>
<%= f.label :first_name %>
<%= f.text_field :first_name %>
<%= f.label :last_name %>
<%= f.text_field :last_name %>
<%= f.submit %>
<% end %>
Wie du sehen kannst, ist es sehr ähnlich zu form_tag
, wo wir eine spezifische URL angeben (user_path
)
form_with using models
Das wirklich coole an form_with
ist, dass es auch für die Übergabe von Modellobjekten verwendet werden kann, ähnlich wie form_for
.
<%= form_with model: @user do |f| %>
<%= f.label :first_name %>
<%= f.text_field :first_name %>
<%= f.label :last_name %>
<%= f.text_field :last_name %>
<%= f.submit %>
<% end %>
Das erzeugt das gleiche HTML, das mit form_for
erzeugt wurde.
Der größte Vorteil von form_with
ist, dass wir uns nicht mehr um die Entscheidung zwischen form_tag
und form_for
kümmern müssen. Wir haben einen raffinierten Helfer, der es uns erlaubt, beide Aufgaben mit nur einem Schalter in der ersten Zeile des deklarierten Formulars zu erledigen.
Abschluss
Rails Formularhelfer sind großartig und die neue Ergänzung von form_with
vereint wirklich alle Vorteile von form_tag
und form_for
. Sie haben jetzt ein Werkzeug, mit dem Sie ein Formular nach Ihren Bedürfnissen erstellen können. Egal, ob es sich um ein Suchformular oder ein Formular zum Übertragen von Daten in Ihre Datenbank handelt, mit den Rails-Formularhelfern können Sie sich darum kümmern.
Ich würde auch empfehlen, die Rails Guides durchzuarbeiten, um mehr über die Erstellung komplexer Formulare zu erfahren. Sie haben eine ganze Reihe von Optionen, die es einem Modell erlauben, verschachtelte Attribute zu akzeptieren, verschachtelte Attribute zu haben, und andere Formularhelfer, um benutzerdefinierte Eingabefelder zu erstellen. Es gibt so viel, mit dem man herumspielen kann, wenn man diese Dokumente durchgeht, also nutze es aus!
Happy Coding!