Páginas Estáticas no Rails
Posted on November 11, 2011
Faz tempo que não posto uma dica técnica, vou retornando aos poucos. Hoje uma dica bem simples mas que muitos ainda desconhecem.
Muitos aplicativos Rails tem seções com páginas estáticas, páginas de conteúdo como institucional, instruções, etc. Digamos que para organizar isso você tenha criado um controller chamado “Page”, assim:
1 |
bundle exec rails g controller Page |
O problema é que eu sempre vejo algo parecido com isto no config/routes.rb
1 2 3 |
match "page/hello" => "page#hello" match "page/help" => "page#help" ... |
Daí no app/controllers/page_controller.rb encontro:
1 2 3 4 5 6 |
def hello end def help end ... |
Actions vazias de placeholder somente para renderizar páginas estáticas como app/views/page/hello.html.erb. E este exemplo tem apenas duas páginas, agora escale isso para algumas dezenas e você verá logo o code smell de um clássico efeito shotgun: múltiplos match redundantes no routes.rb e múltiplos métodos vazios no controller.
Em vez disso, uma das muitas formas de resolver esse problema é fazer simplesmente isto no arquivo config/routes.rb:
1 |
get "page/:id" => "page#index", :as => :page |
E no controller “Page” ter uma única action:
1 2 3 |
def index render params[:id] end |
Agora você pode colocar quantas views quiser em app/views/page e quando chamar http://localhost:3000/page/hello ele irá automaticamente mapear para app/views/page/hello.html.erb.
Eu disse “páginas estáticas” mas na verdade seriam “semi-estáticas” já que normalmente faríamos desta forma porque queremos que a página herde o layout principal e tudo mais. Se for para ser uma página realmente estática, fora do layout padrão do site, etc, você pode simplesmente colocar um html no diretório public.
Dá para melhorar mais isso, fazendo algumas checagens óbvias como validar se o template da página existe:
1 2 3 4 5 6 7 |
def index if params[:id] && template_exists?(params[:id], ["page"]) render params[:id] else redirect_to '/404.html', :status => 404 end end |
A dica é a mesma de sempre: se está parecendo um amontoado de copy & paste em todas as camadas, alguma coisa está definitivamente errada. Como eu disse antes, existem múltiplas maneiras para resolver essa funcionalidade, se tiverem outras melhores, não deixem de comentar.
blog comments powered by Disqus
Archives
- February 12(2)
- December 11(1)
- November 11(4)
- October 11(6)
- September 11(5)
- August 11(1)
- July 11(5)
- May 11(4)
- April 11(11)
- March 11(4)
- February 11(3)
- January 11(4)
- December 10(9)
- November 10(2)
- October 10(10)
- September 10(4)
- August 10(6)
- July 10(14)
- June 10(16)
- May 10(8)
- April 10(14)
- March 10(9)
- February 10(6)
- January 10(14)
- December 09(10)
- November 09(10)
- October 09(7)
- September 09(19)
- August 09(4)
- July 09(12)
- June 09(7)
- May 09(12)
- April 09(11)
- March 09(9)
- February 09(9)
- January 09(12)
- December 08(14)
- November 08(20)
- October 08(15)
- September 08(18)
- August 08(25)
- July 08(13)
- June 08(21)
- May 08(29)
- April 08(27)
- March 08(12)
- February 08(32)
- January 08(31)
- December 07(27)
- November 07(30)
- October 07(25)
- September 07(28)
- August 07(16)
- July 07(15)
- June 07(16)
- May 07(7)
- April 07(13)
- March 07(8)
- February 07(9)
- January 07(24)
- December 06(17)
- November 06(17)
- October 06(15)
- September 06(38)




