A primeira vez que fui apresentado ao Ruby on Rails eu fiquei bastante impressionado. Foi o primeiro framework de programação que eu aprendi e tenho que dizer que me apaixonei um pouco. Eu tinha acabado de aprender como construir aplicações usando Sinatra e achei uma ferramenta incrível, mas então vi o que Rails podia fazer…

Uma característica principal do Rails que eu realmente gostei de usar foi o From Helpers. Ele me permitiu evitar escrever todo o HTML para construir um formulário, e por sua vez me deu a habilidade de fazer funcionalidades mais complexas. Neste artigo eu vou quebrar os diferentes helpers de formulários fornecidos no Rails e até tocar em um novo que foi lançado no lançamento do Rails 5.1.

Criar formulários com HTML pode ser um incômodo às vezes, especialmente quando eles são extra longos com muitos campos de entrada. Eles podem ficar ainda mais complicados quando você precisa do formulário para enviar dados para um endpoint api específico ou para ser associado a um modelo de banco de dados. Aqui está um formulário html para criar um usuário:

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

Como você pode ver, escrever tudo isso pode ficar complexo muito rapidamente. Se você olhar atentamente para o formulário, você pode ver que estamos passando um atributo de ação e método para o nosso formulário para criar um novo usuário. Isso é ótimo e tudo menos Rails é super exigente quando se trata de enviar formulários. Este formulário em particular não faria o corte quando submetido. É aqui que os ajudantes de formulário vêm para o resgate.

Form Helpers

Quando eu aprendi pela primeira vez como usar os ajudantes de formulário, eu honestamente não podia acreditar no que eles faziam. Como você viu pelo formulário anterior que fizemos, leva algum tempo e complexidade para se conseguir. Entretanto, com ajudantes de formulário isso pode ser alcançado com muito menos trabalho e com um pouco de “magia”.

Existem três ajudantes diferentes que nos ajudam a construir formulários rápidos e úteis no Rails, form_tag, form_for, e form_with. O último, form_with, foi introduzido no lançamento do Rails 5.1 e essencialmente combina os dois primeiros helpers.

form_tag

O form_tag é o mais básico dos helpers e por sua vez faz menos “mágica” para você. Ele ainda irá construir o formulário para você, mas você precisará ser mais explícito ao declarar caminhos url e é usado principalmente quando o formulário não está anexado a um Controller#action. Vamos usar um formulário de busca básico como exemplo:

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

Isto irá gerar o seguinte 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>

Como você pode ver, estamos declarando a rota que queremos que os parâmetros do formulário sejam passados em form_tag. Você pode ver isso ocorrendo na linha <%= form_tag("/search", method: "get") do %> e você também pode ver que nós especificamos a requisição http. Isso ainda é bem legal e você pode ver que Rails cuida muito de nós mesmo no helper do formulário básico, mas Rails tem uma versão mais poderosa disso…

form_for

Form_for é o verdadeiro negócio. Este helper permite-nos ligar um formulário a um objecto, permitindo-nos criar/editar um objecto. Como vimos no exemplo form_tag, tivemos de ser explícitos em qual caminho url usar para submeter os parâmetros do formulário, mas form_for permite-nos abstrair isto. Aqui está um exemplo:

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

Isto irá produzir o mesmo código que vimos no nosso primeiro exemplo de um formulário 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>

Você pode ver imediatamente quanto mais limpo este código parece usando form_for. Honestamente é um pequeno golpe que esse pequeno código pode criar todo esse html, mas realmente cria! Você pode ver na primeira linha de form_for que estamos passando uma variável de instância do usuário que irá anexar este formulário àquele objeto. A outra coisa legal sobre passar nessa variável é que Rails vai procurar pelo caminho url apropriado no seu on, comparado com o form_tag onde tivemos que dizer explicitamente para onde enviar os dados.

form_with

  • Talvez fale sobre form_with e sobre seu uso
  • Usar trechos de código por exemplo

Se você olhar para as Notas de Lançamento do Ruby on Rails 5.1, há uma nota que form_for e form_tag estão unificando em form_with. Este maior benefício com este novo helper é form_with pode gerar tags de formulário baseadas em URLs, escopos ou modelos

Vamos ver!

form_with usando URLs

Vamos usar o mesmo exemplo que usamos em form_for e aplicá-lo com form_with usando apenas uma 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 %>

Como você pode ver é muito semelhante ao form_tag onde especificamos uma URL específica (user_path)

form_with usando modelos

O que é muito legal em form_with é que ele também pode ser usado para passar em objetos de modelo, semelhante a 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 %>

Isto irá criar o mesmo HTML que foi produzido usando form_for.

O nosso maior benefício de form_with é que não precisamos mais nos preocupar em decidir entre form_tag e form_for. Temos um ajudante sofisticado que nos permite fazer qualquer trabalho com apenas um interruptor na primeira linha do formulário declarado.

Conclusão

Ajudantes de formulário de e-mail são incríveis e a nova adição de form_with realmente reúne todos os benefícios de form_tag e form_for. Agora você tem uma ferramenta que lhe permitirá construir um formulário baseado em qualquer que seja a sua necessidade. Se é um formulário de busca ou um formulário para persistir dados no seu banco de dados, você pode tê-lo cuidado com os ajudantes de formulários Rails.

Eu também sugeriria passar pelo Rails Guides para aprender sobre como fazer formulários mais complexos. Você tem um monte de opções de permitir que um modelo aceite atributos aninhados, ter atributos aninhados, e outros ajudantes de formulário para criar campos de entrada personalizados. Há tanto para se brincar ao passar por esses documentos, então aproveite!

Codificação Feliz!

Deixe uma resposta

O seu endereço de email não será publicado.