Navigation Bar no Rails

August 15th, 2008

Esses dias eu achei um template pronto na internet (modestamente, sou um péssimo designer) que vinha com uma navbar. Achei bacana e comecei a pensar num jeito Rails de fazer algo bonitinho: ao clicar num item da navbar, esse item fica selecionado.

A primeira coisa que eu pensei, foi em algo como:

minha.url/do/site?current=ATUAL

Tendo, digamos, algo como HomeController, PostController e CommentController, ATUAL podia variar entre Home, Post e Comment. Uma solução, relativamente, clean. Então voltei à Ruby on Rails: Talk e fiz a pergunta: qual a melhor forma de abordar esse problema?

O resultado foi essa discussão: http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/0c0378e25f2d9343

O código que comentei na discussão é o que segue:

app/helpers/home_helper.rb

  1. module HomeHelper
  2.   def build_navbar(items)
  3.     # If I reached the site right now, params[:current]
  4.     # is null.
  5.     params[:current] = "home" if params[:current].nil?
  6.  
  7.     menu=""
  8.  
  9.     items.each do |item|
  10.       menu += content_tag :li, :class => is_current?(item) do
  11.         link_to item, send( "#{item}_url", { :current => item } )
  12.       end
  13.     end
  14.  
  15.     return menu
  16.   end
  17.  
  18.   # Methods ending by ‘?’ returns either "true" or "false"
  19.   # But using it here in "other" context increases
  20.   # readbility.
  21.   def is_current?(item)
  22.     (item == params[:current]) ? "current" : nil
  23.   end
  24. end

#app/views/layouts/post.html.erb

  1. […]
  2. <div  id="nav">
  3. <ul>
  4. <%= build_navbar %w(home posts articles photos) %>
  5. </ul>
  6. </div>
  7. […]

É um código bonitinho, até… Mas eu podia ter usado um params[:current] ||= “home”. :-P

Mas esse código não funciona perfeitamente. Se eu entrar no site via minha.url/do/site/posts, por exemplo, params[:current] não está setada e será setada para “home”, apesar de eu não estar em HomeController. :-)

Então eu comecei a pensar: o que eu posso fazer pra deixar esse código melhor e funcionando sempre? Eu tenho MESMO que usar algo feio como “?current=[home|post|whatever]”? O Rails não tem nada que facilite isso também?

Comecei a procurar no Google por isso. Não lembro as keywords, mas deve ter sido algo como “current controller name rails”, eu descobri um tal de controller.controller_name. E funciona muito bem. :-)

O resultado?

  1. module HomeHelper
  2.   # Build an navbar with items from the givem
  3.   # array. Current nav item would get an
  4.   # "current" CSS’ class.
  5.   def build_navbar(items)
  6.     menu=""
  7.  
  8.     items.each do |item|
  9.       menu += content_tag :li, :class => is_current?(item) do
  10.         link_to item, send( "#{item}_url" )
  11.       end
  12.     end
  13.  
  14.     return menu
  15.   end
  16.  
  17.   # Methods ending by ‘?’ returns either "true" or "false"
  18.   # But using it here in "other" context increases
  19.   # readbility.
  20.   def is_current?(item)
  21.     (item == controller.controller_name) ? "current" : nil
  22.   end
  23. end

MUITO melhor. :-)

Rails não escala

August 8th, 2008

Ainda sobre o mi-mi-mi sobre “Rails não escala” por causa do que aconteceu com o Twitter.

Apenas assista esse vídeo.

http://www.techcrunch.com/2008/08/08/the-rise-and-fall-of-twitter/

C’est la vie

July 28th, 2008

Pessoa 1: Por favor, eu posso falar com a Pessoa 2?
Pessoa 2: É ela mesma. Pois não?
Pessoa 1: Bom. O Fulano me passou seu telefone e me disse com o que você trabalha. Você trabalha como? Por serviço ou por hora?
Pessoa 2: É por hora.
Pessoa 1: E quanto é por hora?
Pessoa 2: É R$ 45,00.
Pessoa 1: E você atende no local?
Pessoa 2: Sim. Mas aí custa mais R$ 45,00. A primeira hora, portanto, fica em R$ 90,00.

Minha conversa ao telefone com uma cliente, ontem a noite.

E ainda me perguntam por que motivo eu quero parar de trabalhar com informática…

UPDATE:

[07/28/08 15:53:06 ] garota : kkkkkkkkkkkkkkkkkkkkkkkkkkkk
[07/28/08 15:53:14 ] garota : aquele diálogo é sério?
[07/28/08 15:53:17 ] garota : haha
[07/28/08 15:53:53 ] davi : sim

Esse novo diálogo fala por si só.

Documentação do Rails

June 19th, 2008

Enfim o que eu precisava para começar, definitivamente, a programar em Ruby On Rails: http://rails-doc.org

Claro que se surgir uma ferramenta parecida para Ruby, as coisas ficam perfeitas. Mas enquanto isso não acontece, vou de irb e vou programando como programo em PHP/C/Perl… :-)

Parabéns aos idealizadores!

Ruby Enterprise Edition

June 13th, 2008

Hoje tomei vergonha na cara e instalei o Ruby Enterprise Edition (podia abreviar para Ruby EE, mas falar o nome inteiro dá um ar de importância a este post) no meu Gentoo.

Então ok. Instalei o mod_rails e comecei a brincar. É um negócio interessante e promissor. Então resolvi instalar o Ruby Enterprise Edition para ver se a história dos 33% é verdade mesmo ou se é só história e me deparei com esse erro:

/opt/ruby-enterprise-1.8.6-20080507/bin/ruby: no such file to load -- auto_gem (LoadError)

Gem faltando? OK. Basta abrir o código e descobrir qual é a Gem, certo? Não. O código é bem enxuto e não parecia ter nada faltando. E eu estava sem paciência de ler (:-) ). Então basta recorrer ao Google.

Caí nesse site: http://fatpenguinblog.com/scott-rippee/usrbinruby-no-such-file-to-load-auto_gem-loaderror/

E adaptei minha linha de comando:

RUBYOPT="" ./ruby-enterprise-1.8.6-20080507/installer

Agora vou lá conferir a história dos 33%… :-)

http://www.rubyenterpriseedition.com/comparisons.html

P.S.: Sim. Eu sei que a história dos 33% é apenas para efeitos de comparação e cada caso é um caso. E eu sei também que Rails não escala… :-)

Enquanto isso, na svn-pt_br…

March 19th, 2008

Retirei os cabeçalhos da mensagem.

Cavalheiro no tronco?

Piadinha

March 19th, 2008

http://xkcd.com/123/

É uma piadinha nerd, eu sei. Mas é o tipo de coisa que me faz rir… :-)

resource_controller x redirect_to

March 17th, 2008

Continuando minha eterna aventura com Ruby on Rails ontem, me deparei querendo usar o método redirect_to junto com o plugin resource_controller, do James Golick.

Bem, o que poderia dar errado? Aparentemente nada. Mas eis que surge um erro:

undefined method `redirect_to' for #<resourcecontroller::failableactionoptions:0x4b05b90>

“Sem problemas”, eu pensei. O que, provavelmente, estava acontecendo, era que o meu controller, de alguma forma, estava herdando apenas de ResourceController::Base e esqueceu do ActionController::Base. Logo, tudo o que eu tenho que fazer, é arrumar a herança e continuar usando o plugin. Certo? É… Digamos que sim…

De acordo com a documentação do plugin, bastava chamar o método resource_controller que ele se encarregaria de todo o trabalho sujo por mim. OK. Vamos lá:

  1. class CommentsController < ApplicationController
  2.   resource_controller
  3.  
  4.   belongs_to :post, :article, :photo
  5.  
  6.   create do
  7.     redirect_to :back
  8.   end
  9. end

Não tem como dar erro, né? Eu também achei…

undefined method `redirect_to' for ActionController::Base:Class

Perguntando na rubyonrails-talk, eu não consegui muita coisa. Por isso, fui além da terceira página do Google e encontrei a seguinte discussão:

http://groups.google.com/group/resource_controller/browse_thread/thread/b4657a4109d6eccd

Agora foi só mudar meu código:

  1. class CommentsController < ApplicationController
  2.   resource_controller
  3.  
  4.   belongs_to :post, :article, :photo
  5.  
  6.   create do
  7.     wants.html { redirect_to :back }
  8.   end
  9. end

E tudo funcionou perfeitamente.
O que mais me causou estranhamento, foi o fato de que a documentação não cita (pelo menos, não claramente para mim) esse porém, e não há (até onde procurei) nenhuma documentação online.

E, infelizmente, eu não posso fazer nada enquanto não dominar o plugin… :-(

Enquanto isso, no MSN…

March 17th, 2008

Conversando com uma amiga sobre a quantia de trabalho que ela está tendo de fazer num curso técnico, comparando com a quantia de trabalhos que ela tinha no curso de Matemática:

“calculo vc aprende na lista de exercicio, sem valer pontinhus”

Tradução do “Version Control with Subversion”

March 12th, 2008

Quem se interessar por esse, IMHO, excelente trabalho, dê uma olhada no seguinte link:

http://svnbook.red-bean.com/

Faz um tempinho que o pessoal está tentando traduzir. Finalmente as coisas pegaram no tranco e agora vai.
O Célio, encontrado na lista, está coordenando o trabalho e acredito que finalmente teremos a versão em Português do manual.

Que puder/quiser ajudar,  basta entrar no link, se inscrever na lista de discussão e encontrará informações sobre como acessar o repositório (no Google Code).