No quarto dia de treinamento o assunto que iremos abordar são as interfaces (ActionView).

Assim como todo framework para interfaces web, o principal é minimizar a utilização de lógicas de controle (if/else) na construção de formulários. Essa diminuição aparece principalmente quando utilizamos os formulários.

Um formulario contem informações que irão ser enviadas, porém que podem ser carregadas. Dai a praticidade de se criar um formulario que ja esteja preparado para trabalhar com dados integradas a outras camadas.

No Ruby On Rails a estratégia não é nunhuma novidade.

Temos diversas instruções para representar um campo associado a um atributo de um registro. Por exemplo :

<% form_for(@fabricante) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :descricao %><br />
<%= f.text_field :descricao %>
</p>
<p>
<%= f.submit "Update" %>
</p>
<% end %>

<%= link_to 'Show', @fabricante %> |
<%= link_to 'Back', fabricantes_path %>

No exemplo acima (gerado pelo scaffold) temos um formulario, seus campos e um botão de submissão. Todo são construidos utilizando instruções do framework, dessa forma não precisamos nos preocupar se estamos preenchendo um formulario, validando se houve erro para retornar os campos preenchidos, etc. O mais importante é que o objeto que vai ter os seus atributos mapeados para os campos do formulario deve ser declarado como um atributo (@) no controller. No nosso exemplo deve existir um atributo @fabricante.

Discutimos muito sobre a utilização de campos <select>, por exemplo. Estes campos são mais complexos pois é necessário uma segunda consulta para mostrar os dados no combo, algo como :

<p><label for="carro_fabricante">Carro</label><br/>
<%= collection_select(:carro, :fabricante_id, Fabricante.find(:all), :descricao, {:prompt => true}) %>

JavascriptGeneratorTemplate

Para que voce possivel utilizar o mínimo de javascript para interações Javascript, foi desenvolvido uma forma de estruturar os arquivos em que a unica linguagem envolvida é o Ruby.

Um exemplo clássico é a pagina de listagem, aonde ao clicar em inserir um novo registro, este aparece na listagem sem que haja refresh na tela. Na prática é incluir uma nova linha na tabela através de operações DOM.

Para quem ja trabalhou com manipulação de objetos DOM em algum elemento HTML (tabela por exemplo) sabe que é preciso um pouco de conhecimento (e código) para que fique do jeito que esperamos. Ja com Rails, o templa RJS faz isso de forma que ele é o arquivo que encapsula a lógica de atualização da interface.

O processo fica assim

Arquivo principal : É a pagina contendo a tabela renderizada.
Arquivo include de linha: O trecho que representa cada linha da tabela é um arquivo de inclusão, que sera utilizado pela pagina principal e pelo script RJS
Arquivo script RJS: O método da controller, ao retornar uma pagina, retorna esse arquivo. Por ser uma chamada assincrona, o resultado do processamento desse arquivo é um codigo Javascript gerado pelo RJS.