segunda-feira, 11 de julho de 2011

Opinião sobre o livro Use a Cabeça! Rails

Introdução

Além de deixar minha opinião sobre o livro Use a cabeça - Rails, este post também é uma forma de documentar algumas técnicas para se trabalhar com AJAX e formulários no Rails 3 bem como mostrar algumas das diferenças encontradas nas duas versões do framework. Não considero o livro muito bom nem péssimo. Mas como na maioria dos livros, no final a gente sempre aprende alguma coisa (ainda bem porque sempre há muito o que se aprender ainda...).
Neste post a principal crítica é sobre a tradução do livro para Português. De resto há algumas comparações entre as versões 2 e 3 do Rails e um pouco mais da minha opinião sobre o livro.

Sobre a tradução

A tradução do livro foi algo que realmente não gostei. Tradução de termos como template(modelos), layout(formato) e partial(parcial) no contexto do Rails, na minha opinião não foi uma boa idéia. Será que é muito difícil encontrar alguém com conhecimento sobre o assunto para fazer a tradução de livros técnicos? Será que falta algum tipo de iniciativa por parte das editoras? Bom, não sei, mas uma coisa é certa: para ler alguns livros já traduzidos, é bom que já se tenha um conhecimento prévio sobre o assunto, caso contrário é capaz de encontrar alguém falando: "você poderia alterar o formato para o cadastro de produtos???" (ao invés de falar: "poderia alterar o template para o cadastro de produtos???" :P)
Além da tradução de termos que não deveriam ser traduzidos, tem também traduções para palavras que fazem parte do próprio código. Na minha opinião há uma incoerência entre o código que é gerado durante a leitura do livro e o texto usado no livro. Um bom exemplo para isso é que após criar um CRUD via scaffold generation chamado seat para lugares de um vôo, o código foi criado com seat. Até aqui tudo bem, o controlador ficou como SeatsController, o model ficou como Seat e assim por diante. Como tudo foi gerado com scaffold neste exemplo, foi gerado automaticamente um mapeamento no routes.rb do tipo resources 'seats'. Porém, em um trecho do livro há uma chamada para a rota usando o termo em portugues ( :controller => 'seats' foi traduzida ficando :controller => 'lugares', o que para um iniciante pode causar alguns minutos (talvez até horas) de dor de cabeça).

Usando Rails 3 enquanto estuda o livro

Alguns métodos (que estavam marcados como deprecated) na versão anterior do Rails não irão mais funcionar no rails 3. Portanto, caso esteja lendo o livro e tenha o Rails 3 instalado, prepare-se para ter que fazer algumas adaptações.
Lendo o capítulo 7 sobre Ajax precisei fazer duas adaptações. Uma para o link remoto e outra para atualização periódica e alguma área da página. Abaixo seguem os exemplos:

Link Remoto - Rails 2 (versão do livro)
<%= link_to_remote(
"Atualizar lugares",
:url => "/flight/#{@flight.id}/seats",
:method => :get,
:update => "seats") %>


Link Remoto - Rails 3
# o helper link_to_remote não existe mais. Para dizer se é remoto é preciso informar uma opção como parâmetro do helper link_to

<%= link_to(
"Atualizar lugares",
:url => "/flight/#{@flight.id}/seats",
:remote => true,
:method => :get,
:update => "seats") %>


Atualização periódica - Rails 2 (versão do livro)
<%= periodically_call_remote(
:url => "/flight/#{@flight.id}/seats",
:method => "get",
:update => "seats",
:frequency => "20") %>


Atualização periódica - Rails 3
# Como no rails 3 o helper periodically_call_remote também não existe mais, utilizei javascript com apoio do prototype
<%= content_for :js do %>
new Ajax.PeriodicalUpdater("seats",
"/flights/<%= @flight.id%>/seats",
{ frequency: 5,
method: 'get' })
<% end %>


Tive que baixar a gem "dynamic_form" para poder utilizar o helper error_messages que também não está mais presente (como padrão) no rails 3.
Bastou adicionar a linha abaixo ao meu Gemfile (localizado na raiz do projeto):
gem 'dynamic_form', '~> 1.1.4'


Após isso executei o comando abaixo e pronto:
adolfo@skynet:~/ruby/web/coconut$ bundle install.


Ainda no capítulo 7 sobre AJAX, existe um tópico com o seguinte título: O formulário precisa estar sob o CONTROLE do JavaScript. A idéia deste tópico é atualizar a lista de lugares de um vôo automaticamente quando um novo registro é inserido sem ter que carregar toda a página novamente. No livro a partial _new_seat.html.erb precisa de uma única alteração:

trocar:
<%= form_for(seat) do |f| %>


por
<%= remote_form_for(seat, :update => 'seats') do |f| %>


Porém, o helper remote_form_for também não existe no Rails 3. Eu já sabia como adaptar para o Rails 3 com jQuery, que aliás encontrei muitos exemplos na web. Como quis usar o prototype (que foi usado no livro e que de certa forma despertou curiosidade =P), realizei a adaptação com o mesmo.
Primeiro que tive que usar o helper para formulários baseados no model disponibilizado pelo Rails 3. Conforme mostrado no código abaixo (repare que não coloquei a opção :update porquê não funcionou):

<%= form_for seat, :remote => true do |f| %>


No final deste mesmo script, adicionei um código javascript não obstrusivo com o auxílio do helper content_for:

<%= content_for :js do %>
function complete_function(evt) {
$('seats').update(evt.memo.request.transport.responseText);
}

$('new_seat').observe('ajax:complete', complete_function);
<% end %>


No código acima, uma função de callback aguarda pelo evento 'ajax:complete'. Após receber o evento, a forma que encontrei de atualizar a lista que está dentro da div seats foi usar a estrutura evt.memo.request.transport.responseText. (Caso alguém saiba como fazer isso de forma mais elegante esteja a vontade para comentar post).

Mais AJAX

O capítulo sobre AJAX foi um que particularmente mais gostei (tirando a tradução, claro). Neste capítulo pude conhecer um helper que não conhecia: update_page. Este helper é acionado quando utilizamos o render :update do |page|. Achei interessante a geração de javascript através deste helper que permite atualizar partes distintas de uma página com conteúdos que podem não ter muito a ver um com o outro.

Conclusão

O livro em geral é muito bom preferivelmente se puder comprar a versão em inglês. Como eu já havia participado de um curso de Ruby on Rails na Caelum, achei que o livro poderia ajudar no estudo do RoR. Porém, praticamente tudo que li no livro já havia sido coberto pelo curso. A partir do capítulo 7 o conteúdo do livro agregou mais. O livro acabou servindo como um guia de exercícios para o que eu havia visto nas aulas e ajudou a conhecer mais alguns helpers do Rails. Outra opinião a respeito do livro é que ele realmente é bem prático porém também é bem básico, não se aprofundando muito em todos os detalhes de alguns dos assuntos abordados. Isso não deve ser encarado como algo ruim, pois algo bem prático não deve mesmo ser muito extenso.
Ao estudar este livro, recomendo que a utilização da API do Rails seja consultada e também outros materiais como a própria apostila da Caelum. Não limite-se apenas ao livro e com certeza estará pronto para sair criando seus projetos com mais tranquilidade.
Outro fator importante pra mim durante a leitura do livro foi que pude perceber algumas diferenças entre o Rails 2 e 3. No 3 eu vinha usando também o JQuery. Como os exemplos do livro são com prototype, valeu a experiência.

Próximos passos

Os próximos passos agora vão ser na linha de colocar em prática alguns projetos pessoais e conferir realmente o quanto pode ser legal e produtivo trabalhar com Ruby on Rails! Nesse meio tempo outros 2 livros poderão ajudar a aprofundar mais no assunto:
Livro de Ruby
Livro de Rails do Heinemeier

Nenhum comentário:

Postar um comentário