Když jsem se poprvé seznámil s Ruby on Rails, byl jsem docela ohromen. Byl to první programovací framework, který jsem se naučil, a musím říct, že jsem se do něj tak trochu zamiloval. Zrovna jsem se učil vytvářet aplikace pomocí Sinatry a myslel jsem si, že je to docela úžasný nástroj, ale pak jsem viděl, co Rails umí…

Jednou z hlavních funkcí Rails, kterou jsem opravdu rád používal, byly pomocníci From. Umožnilo mi to vyhnout se vypisování celého HTML pro sestavení formuláře a zase mi to dalo možnost dělat složitější funkce. V tomto článku rozeberu různé pomocníky formulářů poskytované v systému Rails a dotknu se i jednoho nového, který byl spuštěn ve verzi Rails 5.1.

Vytváření formulářů pomocí jazyka HTML může být někdy nepříjemné, zvláště když jsou extra dlouhé s příliš mnoha vstupními poli. Ještě složitější mohou být, když potřebujete, aby formulář odesílal data do určitého koncového bodu api nebo aby byl spojen s databázovým modelem. Zde je html formulář pro vytvoření uživatele:

<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>

Jak vidíte, vypsání toho všeho může být docela rychle složité. Pokud se na formulář podíváte pozorně, uvidíte, že našemu formuláři předáváme atribut akce a metody pro vytvoření nového uživatele. To je skvělé a všechno, ale Rails je velmi vybíravý, pokud jde o odesílání formulářů. Tento konkrétní formulář by při odeslání neprošel. Zde přicházejí na pomoc pomocníci formulářů.

Pomocníci formulářů

Když jsem se poprvé naučil používat pomocníky formulářů, upřímně jsem nemohl uvěřit tomu, co dokážou. Jak jste viděli z předchozího formuláře, který jsme dělali, vyžaduje to nějaký čas a složitost. S pomocníky formulářů toho však lze dosáhnout s mnohem menší námahou a s docela velkou dávkou „magie“.

Existují tři různí pomocníci, kteří nám pomáhají vytvářet rychlé a užitečné formuláře v systému Rails: form_tag, form_for a form_with. Poslední z nich, form_with, byl zaveden ve verzi Rails 5.1 a v podstatě kombinuje předchozí dva pomocníky.

form_tag

Pomocník form_tag je nejzákladnější z pomocníků a zase za vás dělá méně „kouzel“. Stále za vás sestaví formulář, ale budete muset být explicitnější při deklarování url cest a používá se hlavně tehdy, když formulář není připojen k akci Controller#. Jako příklad použijme základní vyhledávací formulář:

<%= form_tag("/search", method: "get") do %>
<%= label_tag(:q, "Search for:") %>
<%= text_field_tag(:q) %>
<%= submit_tag("Search") %>
<% end %>

Tím se vygeneruje následující HTML:

<form accept-charset="UTF-8" action="/search" method="get">
<input name="utf8" type="hidden" value="&#x2713;" />
<label for="q">Search for:</label>
<input name="q" type="text" />
<input name="commit" type="submit" value="Search" />
</form>

Jak vidíte, v form_tag deklarujeme cestu, kterou chceme předat parametry formuláře. Vidíte, že to probíhá na řádku <%= form_tag("/search", method: "get") do %>, a také vidíte, že zadáváme požadavek http. To je ještě docela úžasné a vidíte, že Rails se za nás postará o spoustu věcí i v základním pomocníkovi formuláře, ale Rails má jeho výkonnější verzi…

form_for

Form_for je skutečné řešení. Tento pomocník nám umožňuje svázat formulář s objektem, což nám umožňuje vytvořit/upravit objekt. Jak jsme viděli v příkladu form_tag, museli jsme být explicitní v tom, jakou url cestu použít pro odeslání parametrů formuláře, ale form_for nám umožňuje toto abstrahovat. Zde je příklad:

<%= form_for @user do |f| %> <%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.submit %><% end %>

Tímto způsobem vznikne stejný kód, jaký jsme viděli v našem prvním příkladu html formuláře:

<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>

Hned vidíte, jak čistěji tento kód vypadá při použití form_for. Upřímně řečeno, je trochu zarážející, že tak malý kód dokáže vytvořit tolik html, ale opravdu to tak je! Na prvním řádku form_for vidíte, že předáváme instanční proměnnou uživatele, která připojí tento formulář k tomuto objektu. Další skvělou věcí na předávání této proměnné je to, že Rails bude hledat příslušnou url cestu sám, ve srovnání s form_tag, kde jsme mu museli explicitně říct, kam má data poslat.

form_with

  • Můžeme si promluvit o form_with a o jeho použití
  • Použijte například úryvky kódu

Pokud se podíváte do poznámek k vydání Ruby on Rails 5.1, je tam poznámka, že form_for a form_tag se sjednocují do form_with. Největší výhodou tohoto nového pomocníka je, že form_with dokáže generovat značky formulářů na základě adres URL, oborů nebo modelů

Pojďme to vyzkoušet!

form_with pomocí URL

Použijeme stejný příklad, který jsme použili v form_for, a použijeme ho s form_withpouze pomocí 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 %>

Jak vidíte, je to velmi podobné jako u form_tag, kde zadáváme konkrétní URL (user_path)

form_with using models

Skutečně skvělé na form_with je, že jej lze použít i pro předávání objektů modelů, podobně jako 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 %>

Tím vytvoříme stejné HTML, jaké vzniklo při použití form_for.

Největší výhodou form_with je, že se již nemusíme zabývat rozhodováním mezi form_tag a form_for. Máme šikovného pomocníka, který nám umožňuje provést obě úlohy pouhým přepínačem v prvním řádku deklarovaného formuláře.

Závěr

Pomocníci formuláře v systému Rails jsou úžasní a nový přírůstek form_with skutečně spojuje všechny výhody form_tag i form_for. Nyní máte k dispozici nástroj, který vám umožní sestavit formulář na základě jakýchkoli vašich potřeb. Ať už se jedná o vyhledávací formulář nebo formulář pro persistenci dat do databáze, pomocí pomocníků formulářů Rails se o to můžete postarat.

Rad bych také doporučil projít si Průvodce Rails, abyste se naučili vytvářet složitější formuláře. Máte poměrně dost možností od povolení modelu přijímat vnořené atributy, přes vnořené atributy a další pomocníky formuláře až po vytváření vlastních vstupních polí. Při procházení těchto dokumentů je toho spousta, s čím si můžete hrát, takže toho využijte!

Happy Coding!

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.