Prima dată când am făcut cunoștință cu Ruby on Rails am fost destul de uimit. A fost primul cadru de programare pe care l-am învățat și trebuie să spun că m-am îndrăgostit oarecum. Tocmai învățasem cum să construiesc aplicații folosind Sinatra și am crezut că este un instrument destul de grozav, dar apoi am văzut ce poate face Rails…
O caracteristică principală a Rails pe care mi-a plăcut foarte mult să o folosesc a fost From Helpers. Mi-a permis să evit să scriu tot HTML-ul pentru a construi un formular și, la rândul său, mi-a oferit posibilitatea de a face caracteristici mai complexe. În acest articol voi detalia diferitele ajutoare de formulare furnizate în Rails și chiar voi aborda unul nou care a fost lansat în versiunea Rails 5.1.
Crearea de formulare cu HTML poate fi uneori o pacoste, mai ales atunci când sunt foarte lungi și cu mult prea multe câmpuri de intrare. Ele pot deveni și mai complicate atunci când aveți nevoie ca formularul să trimită date către un anumit endpoint api sau să fie asociat cu un model de bază de date. Iată un formular html pentru a crea un utilizator:
<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>
După cum puteți vedea, scrierea tuturor acestor lucruri poate deveni destul de repede complexă. Dacă vă uitați cu atenție la formular, puteți vedea că transmitem un atribut de acțiune și metodă la formularul nostru pentru a crea un nou utilizator. Acest lucru este grozav și toate cele, dar Rails este foarte pretențios atunci când vine vorba de trimiterea formularelor. Acest formular special nu ar fi fost acceptat atunci când a fost trimis. Aici intră în ajutor ajutoarele de formulare.
Ajutătorii de formulare
Când am învățat pentru prima dată cum să folosesc ajutoarele de formulare, sincer nu mi-a venit să cred ce au făcut. După cum ați văzut din formularul anterior pe care l-am făcut, este nevoie de ceva timp și complexitate pentru a-l realiza. Cu toate acestea, cu ajutoarele de formulare, acest lucru poate fi realizat cu mult mai puțină muncă și cu destul de multă „magie”.
Există trei ajutoare diferite care ne ajută să construim formulare rapide și utile în Rails, form_tag
, form_for
și form_with
. Ultimul, form_with
, a fost introdus în versiunea Rails 5.1 și, în esență, combină primele două helper-uri.
form_tag
form_tag
este cel mai de bază dintre helper-uri și, la rândul său, face mai puțină „magie” pentru dumneavoastră. Acesta va construi în continuare formularul pentru dumneavoastră, dar va trebui să fiți mai explicit atunci când declarați căile url și este utilizat în principal atunci când formularul nu este atașat la o Controller#action. Să folosim ca exemplu un formular de căutare de bază:
<%= form_tag("/search", method: "get") do %>
<%= label_tag(:q, "Search for:") %>
<%= text_field_tag(:q) %>
<%= submit_tag("Search") %>
<% end %>
Acest lucru va genera următorul HTML:
<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>
După cum puteți vedea, declarăm ruta pe care dorim ca parametrii formularului să fie trecuți în form_tag
. Puteți vedea că acest lucru are loc în linia <%= form_tag("/search", method: "get") do %>
și puteți vedea, de asemenea, că specificăm cererea http. Acest lucru este încă destul de grozav și puteți vedea că Rails are grijă de multe pentru noi chiar și în form helper-ul de bază, dar Rails are o versiune mai puternică a acestui lucru…
form_for
Form_for este adevărata afacere. Acest helper ne permite să legăm un formular de un obiect, permițându-ne să creăm/modificăm un obiect. După cum am văzut în exemplul form_tag
, a trebuit să fim expliciți în ceea ce privește calea url de utilizat pentru trimiterea parametrilor formularului, dar form_for
ne permite să facem abstracție de acest lucru. Iată un exemplu:
<%= form_for @user do |f| %> <%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.submit %><% end %>
Acest lucru va produce același cod pe care l-am văzut în primul nostru exemplu de formular html.
<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>
Vezi imediat cât de mult mai curat arată acest cod folosind form_for
. Sincer, este puțin halucinant că un cod atât de mic poate crea atâta html, dar chiar o face! Puteți vedea în prima linie din form_for
că trecem o variabilă de instanță a utilizatorului care va atașa acest formular la acel obiect. Celălalt lucru grozav legat de trecerea acestei variabile este că Rails va căuta pe cont propriu calea url corespunzătoare, în comparație cu form_tag
unde a trebuit să-i spunem explicit unde să trimită datele.
form_with
- Poate vorbiți despre form_with și despre utilizarea lui
- Utilizați fragmente de cod de exemplu
Dacă vă uitați la Ruby on Rails 5.1 Release Notes, există o notă care arată că form_for și form_tag se unifică în form_with. Cel mai mare beneficiu cu acest nou helper este că form_with
poate genera etichete de formular bazate pe URL-uri, domenii de aplicare sau modele
Să verificăm!
form_with folosind URL-uri
Să folosim același exemplu pe care l-am folosit în form_for
și să-l aplicăm cu form_with
folosind doar un URL:
<%= 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 %>
După cum puteți vedea, este foarte asemănător cu form_tag
în care specificăm un URL specific (user_path
)
form_with using models
Ceea ce este cu adevărat grozav la form_with
este că poate fi folosit, de asemenea, pentru a trece în obiecte de model, similar cu 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 %>
Aceasta va crea același HTML care a fost produs prin utilizarea lui form_for
.
Cel mai mare beneficiu al lui form_with
este că nu mai trebuie să ne facem griji pentru a decide între form_tag
și form_for
. Avem un ajutor ingenios care ne permite să facem oricare dintre lucrări cu doar un comutator în prima linie a formularului declarat.
Concluzie
Ajutorii de formulare Rails sunt grozavi, iar noua adăugare a lui form_with
reunește cu adevărat toate beneficiile atât ale lui form_tag
cât și ale lui form_for
. Aveți acum un instrument care vă va permite să construiți un formular bazat pe orice nevoi. Fie că este vorba de un formular de căutare sau de un formular pentru a persista datele în baza de date, puteți avea grijă de el cu ajutoarele de formulare Rails.
Vă sugerez, de asemenea, să parcurgeți Ghidurile Rails pentru a învăța cum să realizați formulare mai complexe. Aveți destul de multe opțiuni, de la a permite unui model să accepte atribute imbricate, la a avea atribute imbricate și alte ajutoare de formulare pentru a crea câmpuri de intrare personalizate. Există atât de multe lucruri cu care vă puteți juca atunci când parcurgeți aceste documente, așa că profitați de ele!
Codare fericită!