Posted by André Ribeiro Camargo
Wed, 01 Sep 2010 17:26:00 GMT
ActionMailer é uma biblioteca do Rails que trata da manipulação de e-mails e nesta versão 3.0 teve várias melhorias.
Antigamente, você passava parâmetros para “view” através do método “body”, mas, na nova implementação você define os parâmetros como variáveis de instância na action do mailer e depois simplesmente as referencia na view.
Demorei algumas horas para me dar por conta disso, “herança” da versão antiga.
Para finalizar, se quiser usar os helpers na view do mailer, inclua na classe do mailer:
helper :application
Essa dica veio daqui
Muito legal ;-)
Posted in trabalho, nerd, rails, shoppings
Posted by André Ribeiro Camargo
Wed, 28 Jul 2010 11:31:00 GMT
Dica legal: Faster Ruby Gems installs
Normalmente eu passava—no-rdoc—no-ri pela linha de comando mesmo.
Posted in trabalho, nerd, rails
Posted by André Ribeiro Camargo
Tue, 27 Jul 2010 17:16:00 GMT
http://graphjam.com/2010/07/26/funny-graphs-typical-website-evolution/
BOA! :-D
Posted in trabalho, nerd
Posted by André Ribeiro Camargo
Sun, 25 Jul 2010 20:52:00 GMT
Esta é útil para quem armazena sessões no banco de dados.
Antigamente, para acessar o model bastava “session.model”, agora tem que ser através de “request.env[‘rack.session.record’]”.
Fica a dica…
Posted in trabalho, rails
Posted by André Ribeiro Camargo
Sat, 24 Jul 2010 01:40:00 GMT
Aventura continua, já tenho doze requisições passando no teste de integração do portal. Antes tinha ZERO testes, então, acho que estamos evoluindo rapidamente.
Mas, só passei para avisar aqueles que estão migrando do Rails 1.1.6, para QUALQUER versão superior, sobre o “problema do parâmetro que contém pontos”.
Exemplo:
Aplicação deve processar uma requisição cujo caminho possui pontos, tipo:
/descadastrar/andre@boaideia.inf.br
A rota no Rails 1.1.6 seria:
map.connect "descadastrar/:email", :controller => "controlador", :action => :acao
Para funcionar no Rails3, tem que fazer:
match "descadastrar/:email" => "controlador#acao", :constraints => { :email => /.*/ }
Daí vai funcionar beleza, o “problema” é que apartir da versão 2.0 o Rails utiliza os pontos para escolher o formato da resposta da requisição.
Ai ai, já fazia algumas horas que eu estava procurando entender o motivo pelo qual essa versão 3 me retornava “No route matches”. Coisa triste a ignorância.
PS: NESTE caso, como o parâmetro é um endereço de correio eletrônico, vocês podem até utilizar um regex mais apropriado do que este do exemplo.
Fui!
Posted in trabalho, rails, shoppings
Posted by André Ribeiro Camargo
Wed, 21 Jul 2010 13:45:00 GMT
Meu segundo projeto em Rails, o PelotasCenter, está para completar 4 anos em produção. Implementado em Ruby on Rails 1.1.6, está funcionando bem. Não posso me queixar.
Mas, o ecosistema Rails evolui muito rápido, nesses 4 anos muitas ferramentas surgiram ou evoluíram. Atualmente a comunidade vive a expectativa do lançamento da versão 3 do Rails.
Agora que os requisitos dos clientes estão satisfeitos e não tenho mais tanta demanda para implementação de novas funcionalidades, vou me concentrar no trabalho de portar a aplicação dos shoppings para o novo Rails.
Depois de instalar o Beta4, criei uma nova aplicação e comecei a reimplementação da camada de aplicação (não vou mexer no banco de dados).
Gostei do comando “rails”, que agora serve para criar uma nova aplicação, carregar o console, executar generators, levantar o servidor web para desenvolvimento e todas aquelas outras funcionalidades que ficavam no diretório scripts do projeto.
Gostei também do Bundler, vai ajudar bastante aqueles SysOps que não querem aprender Rails e só precisam instalar o projeto em produção.
Achei muito sexy a nova nomenclatura das rotas. Cadastrei a rota raíz do shopping, levantei o WebBrick e acessei a aplicação para ver que dependências precisam ser satisfeitas.
Primeira dependência, relacionada aos plugins… Dependo de vários, isso pode vir a ser uma dor de cabeça, pois alguns deles estão ultrapassados e não foram portados para Rails3.
Mas, “dor de cabeça”? Calma lá, não tenho pressa de fazer isso funcionar, é para ser um aprendizado, que ao ser finalizado vai para produção hehehe
Para I18n no Rails 1.1.6 uso Globalize. Rails3 inclui I18n e vi que o Globalize2 (que parece rodar no Rails3) ainda não suporta todas funcionalidades da versão 1. Bom, não vamos complicar agora, então defini alguns objetos que “simulam” o Globalize1, só para ir adiante. Futuramente eu vejo como migrar pro I18n nativo do rails.
Depois, foi a vez do FileColumn. Sei que é um plugin velhinho, mas supre muito bem minha necessidade. Instalei a versão preparada para Rails 2.2.2 e pelo menos até agora, os helpers estão funcionando. Vamos adiante…
Com isso, já estava conseguindo renderizar a capa do portal, com apenas um problema. hehe
No ERB do Rails3 as Strings são “escapadas” por padrão, depois de instruir meus helpers para usarem html_safe, a coisa começou a ficar com cara de pronto. Ainda falta portar as actions que carregam conteúdo por XHR.
Ah! Alguns recursos não fazem mais parte do Rails e viraram plugins, como: acts_as_list e acts_as_tree. Também instalei o prototype_legacy_helpers.
Agora de tarde, tem mais…
Posted in trabalho, shoppings
Posted by André Ribeiro Camargo
Tue, 08 Jun 2010 10:30:00 GMT
Uso MySQL na aplicação dos shoppings com storage InnoDB. Funciona muito bem.
Mas ultimamente notei um gargalo de performance no banco quando tenho alguns INSERTs concorrentes na tabela de acessos (tipo uns 9). SHOW PROCESSLIST no console do mysql não mostrava outra coisa que não fosse COMMIT na informação das threads. E as requisições acabam ultrapassando a minha meta de consumir, no máximo, 1 segundo.
Pesquisei um pouco a respeito de como otimizar isso e descobri o INSERT DELAYED, vamos tentar…
Primeiro mexi no banco, ALTER TABLE nome_da_tabela ENGINE=MYISAM; para converter a tabela de InnoDB para MYISAM.
Depois alterei a aplicação, copiando o método ActiveRecord::Base#create para meu model e renomeando-o para create_without_callbacks (eu uso before_create para setar alguns atributos e queria manter os callbacks funcionando)
E para ver se funcionou, no console do MySQL rode SHOW STATUS LIKE ‘delay’; e leia aqui o significado de cada variável
Estou ansioso para comparar os logs de produção :-)
Posted in trabalho, nerd, pessoa jurídica, rails, shoppings
Posted by André Ribeiro Camargo
Mon, 31 May 2010 23:26:00 GMT
Hoje fui converter um gráfico de pizza e notei que o padrão da Gruff é usar percentuais na legenda.
Só que a Bluff tava mostrando o valor da série.
Então, ajustei o código para ficar igual ao gráfico original.
Posted in trabalho, nerd
Posted by André Ribeiro Camargo
Wed, 19 May 2010 23:27:00 GMT
Sou usuário de Gruff há muito tempo, utilizo principalmente gráfico de barras nas estatísticas dos shoppings.
Ontem, descobri o Bluff. Que pretende fazer o mesmo que o Gruff, só que usando javascript ao invés de ruby.
Gostei muito das tooltips do Bluff, então comecei a ver como seria para migrar o que tenho em Gruff.
O detalhe, é que eu queria modificar o conteúdo da tooltip, para mostrar mais dados.
A versão oficial do Bluff não suporta este recurso…
MAS, se vocês precisarem desta funcionalidade, peguem o código do meu fork no github que ele faz isso.
Dica de como fazer? Dá uma olhada neste exemplo, especificamente na função tooltips_renderer do gráfico custom_tooltips.
Agora é com a nossa criatividade, happy coding everybody!
Dica #2: gem install jake e rodem “jake” no diretório do projeto para gerar o arquivo bluff-min.js que deve ser linkado pela sua página.
Dica #3: instanciem o gráfico no window.onload… senão terão problemas no IEka.
Posted in trabalho, nerd
Posted by André Ribeiro Camargo
Wed, 21 Apr 2010 00:24:00 GMT
Um cliente me pediu para integrar o site dele com o Google Analytics.
Até aí, tranquilo, é barbada.
Só que, meus portais implementam identificação única (single sign-on). O cara se identifica em um dos sites e ao acessar qualquer outro do portal o sistema mantém ele identificado.
Implementei isso autenticando o usuário num site “central” e ao acessar os outros sites o sistema faz alguns redirecionamentos para verificar se aquele cara já está logado ou não.
Robôs não deviam se identificar, logo, podemos ignorar os redirecionamentos.
Aí que veio o problema, o robozinho que verifica se o site tem o código que ativa o Google Analytics não declara User Agent algum nas requisições.
Não sei porquê… Facilitaria a vida de nós (desenvolvedores) na busca do problema que impede a identificação do site pelo GA.
Resolvi meu problema, interpretando os logs de acesso do apache para descobrir quais eram as requisições desse cara, então coloquei o IP dele na lista do meu sistema que identifica os robôs, mas…. quando será que o google vai trocar o IP deste servidor?
Se tivesse o User Agent, ficaria menos POG…
Posted in trabalho, nerd, shoppings