Tradução: Trazendo provides/display do Merb para o Rails 3
December 29th, 2008
A essa altura todos já sabem sobre a fusão de Rails e Merb, então não me dar ao trabalho de noticiar ou comentar.
O interessante agora vai ser ver exatamente o que de bom do Merb que o Rails vai ter na versão 3. O DHH já postou uma das mudanças e eu traduzo abaixo:
Trazendo provides/display do Merb para o Rails 3
O fluxo de idéias do Merb para o Rails 3 já está caminhando. Deixe-me mostrar um dos primeiros exemplos que estive trabalhando no design. Merb tem uma feature relacionada à estrutura do respond_to do Rails que funciona para os casos genéricos onde você tem um objeto ou coleção que você gostaria de servir em diferentes formatos. Aqui está um exemplo:
1 2 3 4 5 6 7 8 9 |
class Users < Application provides :xml, :json def index @users = User.all display @users end end |
Este controller pode responder a requisições html, xml e json. Quando display for executado, ele primeiro checará se existe um template disponível para o tipo requisitado, o que é normalmente o caso com HTML, e caso contrário tentará converter o objeto. Então @users.to_xml como resultado de uma requisição XML.
As aplicações em que eu trabalhei nunca tiveram realmente este caso, no entanto. Sempre tive que fazer mais do que apenas converter o objeto para o tipo ou renderizar um template. Ou eu precisava fazer um redirecionamento para um dos tipos em vez de renderizar ou eu precisava fazer outra coisa além de renderizar. Então eu nunca passei muito tempo com o caso default que já vem com os scaffolds:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class PostsController < ApplicationController def index @posts = Post.find(:all) respond_to do |format| format.html format.xml { render :xml => @posts } end end def show @post = Post.find(params[:id]) respond_to do |format| format.html format.xml { render :xml => @post } end end end |
Corte duplicação quando possível, dê controle total quando não
Mas o caso da duplicação é definitivamente real para algumas classes de aplicações. E isso é muito feio. Os blocos respond_to se repetem para index, show e geralmente mesmo no edit. Isso é três vezes uma estrutura razoavelmente peso-pesada. Este é o caso em que provides/display vem a calhar e elimina a duplicação.
Para o Rails 3, nós queremos o melhor dos dois mundos. A estrutura completa do respond_to quando você precisa fazer coisas que não estavam na estrutura genérica, mas ainda ter a abordagem genérica na manga para quando as circunstâncias estiverem disponíveis para seu uso.
Lidando com simetria e expansão progressiva do design da API
Há algumas desvantagens na dupla provides/display, porém, que gostaríamos de lidar ao mesmo tempo. A primeira é a falta de simetria nos nomes dos métodos. As palavras “provides” e “display” não refletem o seu relacionamento próximo e se você ainda levar em conta o fato que eles estão realmente relacionados à renderização, a coisa fica ainda mais feia.
A simetria se relaciona com outro ponto no design da API que estive interessado ultimamente: expansão progressiva. Deveria haver um caminho suave do caso simples para o caso complexo. Deveria ser como um Ogro, ele deve ter camadas. Aqui está o resultado que chegamos:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class PostsController < ApplicationController respond_to :html, :xml, :json def index @posts = Post.find(:all) respond_with(@posts) end def show @post = Post.find(params[:id]) respond_with(@post) end end |
Esse é o exemplo padrão de provides/display, mas ele tem a simetria no respond_to como método de classe, respond_with como método de instância, e os blocos originais respond_to. Então ele também parece progressivo quando você abre o respond_with e o transforma em um respond_to completo se você repentinamente precisa de diferenças por formato.
O design também estende o estilo de trabalhar somente em nível de instância sem os default de nível de classe:
1 2 3 4 5 6 7 8 9 10 11 |
class DealsController < SubjectsController def index @deals = Deal.all respond_with(@deals, :to => [ :html, :xml, :json, :atom ]) end def new respond_with(Deal.new, :to => [ :html, :xml ]) end end |
É bastante frequente que a action index tenha responsabilidades de formato diferentes do new ou do show ou de qualquer outra coisa. Esse design aborda todos esses cenários.
Yehuda também esteve interessado em melhorar a performance do respond_to/with ao eliminar os blocos necessários. Especialmente quando você está apenas usando respond_with que não precisa declarar bloco algum.
Levando em conta tudo isso, acho que este é um grande exemplo to tipo de funcionalidade superior que pode sair de idéias misturadas dos dois lados. Estamos certamente animados em fazer o mesmo truque em vários outros elementos do framework. Tenho explorado como um roteador revisado que importa as melhores idéias de ambos poderia ser. Escreverei sobre isso quando tiver algo real para compartilhar.
E-commerce usando Spree
November 25th, 2008
Como o Marcio Trindade falou no seu blog, implementei, junto com a equipe da DBurns Design, um e-commerce em Rails usando como base o Spree.
O Spree tem o básico para um e-commerce: produtos, carrinho de compras, checkout, pagamento por cartão de crédito (usando o ActiveMerchant) e taxonomias (categorização). O resto pode ser customizado por você mesmo usando extensões. No nosso caso, fizemos uma extensão para mudar todo o layout da loja, outra para as páginas de conteúdo usando o nosso CMS próprio, outra para imagens para imprensa, e adicionei uma extensão para busca feita pelo Edmundo Valle Neto. O site não está no ar ainda, mas deve estar em breve.
Durante o desenvolvimento do projeto, notei que faltavam algumas features que o cliente exigia: suporte a SSL e pagamentos através do Authorize.Net (até então suportava apenas Linkpoint e PayPal). No melhor espírito open source, postei na lista, o mantenedor (Sean Schofield) me pediu para implementar e o fiz. O Sean aprovou os patches e os incorporou ao projeto, portanto agora o Spree suporta pagamentos pelo Authorize.Net e SSL.
Turbo Pascal: 25 anos
November 20th, 2008
Hoje o Turbo Pascal completa 25 anos. Foi lançado em 20 de novembro de 1983 (duh). Pelo que pesquisei, foi a primeira IDE a ser lançada, pois além de editar os códigos, também compilava, debugava e gerava executáveis.

Foi com o Turbo Pascal que eu comecei a programar, quando entrei na faculdade (hoje em dia isso é considerado muito tarde), em 1995 (olhem só, justamente quando a Borland deixou de desenvolvê-lo, por causa do Delphi). A disciplina de Introdução à Computação (MAC-110) era dada em Pascal, e no laboratório do IME-USP (CEC) tínhamos o Turbo Pascal instalado para fazermos os EPs (exercício-programa).
Achei o Pascal uma linguagem bem fácil para aprender a programar (tanto que Niklaus Wirth a criou justamente para ensinar programação estruturada), por sua semelhança com o inglês, como é hoje o Ruby.
Depois do primeiro ano nunca mais programei em Pascal (nem em Delphi). Já passei por C, C++, Perl, Java, PHP, Ruby, até Cobol e Clipper, mas sempre vou lembrar do Turbo Pascal e sua interface no DOS, me matando para terminar os EPs até a hora da entrega :)
Tem alguma história sobre o Turbo Pascal? Comente aqui.



