Felipe Diesel

Desenvolvedor de software

Rails 3: Usando OpenStruct em formulários de busca

September 18, 2010 -

Fazer formulários que não tenha um Model diretamente associado sempre foi um problema no Rails. Isso se deve ao “Convention over configuration” e não vejo grandes problemas nisso, pois 90% dos formulários são para criação/edição de dados no Banco de Dados e, por conseqüência, utilizam um Model.

Mas e os outros 10%?

Vi um artigo no blog da Plataforma sobre como resolver esse problema, porém o código parou de funcionar com o Rails 3. Para descobrir o por que disso, fui investigar no código do Rails (a esse mundo OpenSource) e descobri que quando você inclui por exemplo um text_field é retornado um novo objeto da classe InstanceTag e executa o método to_input_field_tag.

Neste método to_input_field_tag, que está o problema. Passou-se a testar se na classe que está sendo chamado o form existe o método do text_field que queremos e nesse caso não existe, gerando um erro.

Para contornar isso é nessesário fazer um Monkey Patch na classe OpenStruct modificando o método respond_to?:

class OpenStruct
  def respond_to?(symbol, include_private = false)
    ! ActiveRecord::Base.instance_methods.include? symbol.to_s
  end
end

Assim, ele responderá a qualquer coisa menos ao aos métodos de instância que o ActiveRecord, evitando que nos passemos totalmente por um model, o que causaria outros problemas.

Além disso modifiquei o nome do helper, já que não utilizava isso apenas para buscas, e primeiro é verificado se uma variável de instância com o nome do objeto existe (@contacts por exemplo) e caso não exista é buscado da variável params:

require 'ostruct'
module OpenFormHelper
  def open_form_for(object_name, options={}, &block)
    options[:html] = {:method => :get}.update(options[:html] || {})
    options[:as] = object_name
    object = OpenStruct.new(instance_variable_get("@#{object_name}") || params[object_name])
    form_for(object, options, &block)
  end
end

Fiz a modificação da variável pois em algumas buscas queria que algumas opções viessem marcadas por padrão, ou seja teria que adicioná-las a uma variável e escrever no params não é recomendável.

Quanto a utilização, veja lá o artigo do Vinícius lá no blog da plataforma que tem exemplos de utilização.

Lendo o código do Rails

Uma dica final que eu gostaria de deixar é que quando problemas como esse ocorrem é a melhor hora para investigar o código do Rails e tentar descobrir o que está acontecendo, ficando muito mais fácil entendermos como o Framework funciona.

Migrando para o tumblr

April 2, 2010 -

Migrações e migrações. Sim, saí do Wordpress e fui pro tumblr. Eu sempre tive o WP instalado num servidor próprio, mas já estava ficando cansado de fazer backup, atualizações. Porém o principal motivo da mudança é que postar no tumblr é mais informal, mais solto. Algumas vezes comecei a escrever um texto, mas acabava não publicando por precisar de muito tempo.

Pois bem, mas como sou desenvolvedor e acredito que a maioria de quem lê esta bagaça (como diria o CQC) o interessante é como foi feita a migração.

Eu vi essa semana o script disponibilizado pelo Cairo Noleto, porém ele importou apenas os textos e eu queria importar o máximo possível de informação. Encontrei então outro script de importação que fazia algo mais próximo do que eu esperava e o melhorei corrigindo os erros que iam ocorrendo.

Veja o script de importação do wordpress para o tumblr.

O script importa os posts, categorias e tags. E para os comentários é usado o Disqus, pois fica muito mais fácil integrar.

Algo que não gostei muito foi do fato de o script original usar o hpricot, que apesar de ser uma excelente gem, é pra fazer parse de HTML e não de XML provocando um erro no qual o link era interpretado como uma tag HTML, e o lin pro artigo não era encontrado, por isso tive que renomeá-lo para .

Além dessa migração troquei o domínio de felipediesel.net para felipediesel.com e tive que fazer um monte de redirecionamentos.

CSS específico para cada página com RubyOnRails

March 26, 2010 -

Muitas vezes queremos adicionar um CSS específico para uma página. Você poderia fazer isso adicionando uma folha de estilo específica daquela página (em inglês) ou criando um id específico para cada página.

Com Rails eu faço da seguinte forma:

E no CSS:

O “page_” na frente serve justamente para não misturar o id do body com o id da table ou div na hora de listar os registros.

Prefiro utilizar este modo, pois não é necessário fazer um novo download apenas para alguns estilos para a página específica e todo o CSS já fica cacheado a cada requisição, logo se torna mais eficiente. Porém se uma página for muito diferente das outras e tiver muito CSS o método citado pelo Shaun pode ser mais útil.

Livro jQuery - A Biblioteca do Programador Javascript

February 3, 2009 -

A primeira impressão que tive do novo livro do Maujor foi que era muito básico. Mas mesmo assim continuei lendo e comecei a repensar minha opinião.

jQuery por Maujor

A Editora Novatec me mandou um exemplar do livro jQuery - A Biblioteca do Pramador da Javascript, escrito pelo Maurício Samy Silva, o já conhecido Maujor; e fiquei de fazer uma resenha do livro aqui no blog. O Maujor não precisa de apresentação, foi com o site dele que dei os primeiros passos nos padrões web e agora vem com o lançamento do primeiro livro sobre jQuery no Brasil.

O livro é muito didático, muito bem escrito e fácil de acompanhar. Explica desde conceitos básicos, do pra que serve a função $() e como funcionam as expressões até efeitos avançados e plugins.

Apenas senti falta de um capítulo sobre AJAX. Sei que isso não faz parte do escopo do livro, é até mencionado nos primeiros capítulos essa falta, mas acredito que vai ficar faltando algo quando alguém tiver o primeiro contato com jQuery através do livro.

Comecei a ler o livro de ponta a ponta mas, já que trabalho com a jQuery diariamente há mais de 2 anos,  uma sensação de Dejavu me acompanhava enquanto seguia no livro e resolvi mudar minha abordagem, utilizando o livro mais como um guia de referência. O que melhorou muito meu aproveitamento. Hoje o livro está na minha mesa de trabalho e aposentei as APIs!

Portanto recomendo o livro tanto para quem apenas ouviu falar dessa tal de jQuery, quanto para quem já é expert no assunto. Vá lá no site conferir.

Dica: Listando as rotas no console

September 21, 2008 -

O Carlos Brando publicou hoje um artigo sobre como testar rotas no console. Achei legal e decidi compartilhar um código que uso freqüentemente, mas que serve para listar todas as rotas nomeadas existentes. Faça o seguinte no terminal:


$ ./script/console
>> app.methods.grep /_path$/

Este comando, pega todos os métodos da aplicação e filtra utilizando uma expressão regular.

Para melhorar a visualização, você pode adicionar o “y” na frente, para que ele converta o array de retorno em yaml:


>> y app.methods.grep /_path$/

E para ficar ainda melhor, adicione o “sort”, para ficar em ordem alfabética:


>> y app.methods.sort.grep /_path$/

O problema é que existem muitas rotas, numa aplicação bem pequena que tenho aqui chega a 500. Para contornar isso você pode utilizar o poder das expressões regulares. O código abaixo, lista apenas as que começam com ‘s’:


>> y app.methods.sort.grep /^s.*_path$/

Se você não conhece Expressões Regulares, dê uma lida na Web, tem muito material. Caso prefira livros, dê uma conferida no “livro do piazinho”, do Aurélio.

E o curso de Rails já acabou…

July 26, 2008 -

Conforme falei no artigo anterior, fiz o curso de Ruby On Rails da e-Genial, que infelizmente se encerrou na quinta, dia 23. Foram 21 aulas, com direito a lista de discussão, material de estudo de primeira e um instrutor, o Júlio Monteiro muito bom. De quebra ainda conheci muita gente legal e que com certeza manterei contato.

Foi muito interessante a proposta do pessoal da e-Genial de fazer um desafio: montar um software de gestão escolar, com cadastro de alunos, instrutores, cursos, turmas, aulas e ainda lista de chamada! Os melhores ganhariam livros.

A maioria do pessoal do curso não fez, ou não conseguiu terminar, mas eu recomendo muito que se lhe for proposto algo assim, deixe um fim de semana de lado e se dedique a isso. Não tanto pelo livro, que é um incentivo legal, mas pelo aprendizado que algo assim proporciona. Eu fiz e aprendi muita coisa nesse sistema, pois as dúvidas só aparecem quando você mete a mão na massa.

E o ganhador? Bom, não que eu queira me gabar nem nada, mas eu ganhei! :D O prêmio foi um livro muito bom, o Rails Way, do Obie Fernandez. Estou agora a espera do livro, que está vindo pelo correio, já que o curso foi online, para mergulhar de cabeça em mais material sobre Rails. Se você quiser ver meu projeto, é só acessar no github ou fazer o download do tarball.

Gostaria ainda de elogiar o TreinaTom, que eu insisto em chamar de Teletom (vai ver o Carlos Eduardo é amigo do Sílvio Santos). O ambiente é muito legal, com a interação entre professor e aluno acontecendo na hora. Pior coisa de curso online são aqueles em que só há apostilas e fórum e este não foi assim, teve vídeo, screensharing e muito bate-papo.

O Júlio também foi sensacional, muito prestativo e paciente com nossas dúvidas beirando o ridículo. Ontem ele disse que nossa turma foi a melhor que ele já trabalhou até hoje e que éramos muito interessados. Mas eu sei que ele diz isso pra todas turmas. :)

Bom, se você chegou até aqui, é por que já deve estar interessado no curso. E pra não dizer que foi tudo elogios, faltou falar um pouco mais sobre Testes, que é algo muito importante e que não consegui entender o fluxo de trabalho, mas tenho certeza que vai estar melhor nos próximos cursos. Esse problema vou resolver com um screencast do Peepcode.

Ruby On Rails, aqui vou eu

July 13, 2008 -

Ruby On RailsTenho andado com os meu queixo dolorido nos últimos dias. Há um mês estou fazendo o curso de Ruby On Rails da e-Genial e estou embasbacado com o framework. Tenho estudado Rails por conta já faz um ano, mas nunca saindo do básico (com o Django fiz a mesma coisa). Claro que isso parece ser chover no molhado, mas o Rails é realmente impressionante.

Pelo que vi até agora o grande diferencial dele é o Active Record. Eu trabalho o CodeIgniter recentemente, mas ele não tem ORM e isso faz uma falta enorme, já que no Rails os Models tem a função de configurar a tabela do banco de dados e deixando todo o resto pro Active Record, enquanto no CI, é um repositório de funções relacionados ao BD; fazendo o desenvolvimento ser muito mais rápido no Rails.

Outra qualidade que percebi nesse meu “namoro” com Rails, foi a Comunidade, que é muito ativa, trazendo novidades e material quase que diariamente. Tanto a comunidade internacional (dá pra chamar assim?), quanto a brasileira são legais. Isso contou muito na hora que optei pelo Ruby/Rails (em detrimento do Python/Django).

RubyOutra grande vantagem do Rails, é o Ruby. Isso mesmo, a linguagem utilizada no framework é muito boa. É legível, padronizada e muito poderosa. Eu trabalho com PHP fazem 4 anos e não quero cuspir no prato que comi (e ainda como), mas PHP é muito desorganizada.

Me chamou a atenção no Ruby o modo literal com que as coisas são programadas (3.times { print “Hi!” }, quer algo mais claro que isso?) e o fato de ser totalmente orientada a objeto. Isso mesmo até as operações básicas, com a soma, são objetos! :D

Claro que essas opiniões aqui escritas são percepções minhas, e estão longe de ser verdades absolutas, já que como disse Nelson Rodrigues, “toda unanimidade é burra”. Mas eu não estou sozinho.

Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!

July 12, 2008 -

Wikipedia…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!

SSH mais simples ainda

June 2, 2008 -

Eu estava brigando a com o rsync para enviar um arquivo para um servidor em que a posta ssh não era a 22 (padrão) e descobri algo muito mais interessante, que com certeza é útil para muita gente.

Você pode criar aliases para suas conexões ssh. O rsync roda utilizando o ssh, então também funciona. Com isso, você pode logar via ssh da seguinte forma: ssh servidor.

Para que isso funcione, altere (ou crie se necessário) o arquivo ~/.ssh/config da seguinte forma:


Host servidor
  hostname enredeco.do.host.com
  user nome.do.usuario
  port 22

A porta só especifique se não for o padrão.

Fácil não?

E não esqueça de dar uma olhada no meu artigo sobre como logar sem senha, para facilitar ainda mais sua vida! :D

Utilizando layouts no CodeIgniter

May 21, 2008 -

Na grande maioria dos sites e sistemas web é apenas modificado o miolo da aplicação, enquanto que o cabeçalho, rodapé, menu, etc. permanecem iguais. E utilizando o modelo MVC, normalmente para cada action do controller temos uma view correspondente, sendo que geralmente um controller: Main com uma action: index, terá a view main/index.php.

No Code Igniter teríamos que fazer tudo manualmente, já que não há como definir um layout que será carregado em cada view, nem esse carregamento automático.

Pelo menos não havia… :D

Criei um pequeno hook que faz esse serviço. Crie seu controller como abaixo:


class Main extends Controller {

  function Main()
  {
    parent::Controller();
  }

  function index()
  {
    $this->data->foo = $this->db->get('main_table');
  }

  function show()
  {
    $this->data->foo = $this->db->get('another_table');
    // Você pode definir manualmente a view e o layout da seguinte forma:
    $this->view = 'main/index';
    $this->layout = 'popup';
  }
}

E ao acessar as duas actions a view main/index.php será chamada com os valores definidos na variável $this->data. Também será carregado o layout application/views/layouts/default.php na função index e application/views/layouts/popup.php na função show.

Download

Faça o download da hook ou de uma aplicação de exemplo (CI 1.6.2).

Instalação

Para utilizar este hook, copie o arquivo Layout.php dentro da pasta application/hooks/, defina a opção $config[‘hooks’] com true no config e adicione o seguinte no arquivo application/config/hook.php:


$hook['post_controller'][] = array(
  'class'    => 'Layout',
  'function' => 'view',
  'filename' => 'Layout.php',
  'filepath' => 'hooks',
  'params'   => array()
);

Espero que goste tanto de utilizar isto quanto eu. Me salva algumas linhas de código.