Feeds completos

Há algum tempo atrás eu havia visto uma campanha pelos feeds completos no blog do Rafael Arcanjo.

Entrar nos méritos de classificar se é melhor ter feeds resumidos ou feeds completos, na minha opinião, é completamente desnecessário. "How many angels could dance on the head of a pin?"

Tudo é basicamente uma questão de preferência pessoal. Se o caso é esse, a solução é simples. Adotar os dois tipos!

Com esta linha de pensamento, hoje passo a disponibilizar o feed deste blog também no formato completo. Uma alteração simples que agrada gregos e troianos. =)

comentários

Gerando feeds Atom com Rails

Agora que eu já fiz toda a parte mais básica do blog é hora de começar a incrementá-lo. Dentre a minha lista de novos requisitos estava: gerar feeds RSS (atom).

As dificuldades técnicas que encontrei pelo caminho foram:

  • A estrutura de um documento atom válido;
  • Definir o content-type de uma requisição com o Rails;
  • Gerar um arquivo estático pela administração que depois só será lido na área aberta do blog;
  • Remover HTML em um controller.

Alguns destes itens pode não ser novidade para você, mas para mim que ainda estou nas fraldas com Ruby (e Rails) é diferente!

Antes de prosseguir, quero deixar claro que provavelmente (ou talvez, definitivamente =) esta não é a melhor forma de se gerar uma página estática com algum conteúdo. Se você sabe de algum ponto que possa melhorar a forma exposta abaixo, deixe seu comentário! :D

A estrutura básica de um arquivo atom

Esta parte foi fácil. Com 5 minutos de pesquisa no Google eu já tinha alguns documentos válidos para me basear. Tomei como base o exemplo encontrado na Wikipedia.

Definindo o content-type

Este artigo me mostrou como definir o content-type. No exemplo, ele define o content-type para todo o controller. Como eu queria apenas para uma action específica, só precisei fazer uma pequena alteração na linha do before_filter:

before_filter :set_atom_mime_type, :o nly => :atom

A parte adicional está em negrito. Muito simples, muito prático. :D (você pode passar um array ali quando quiser definir mais que uma action para passar pela função)

Gerando o arquivo estático

Minha idéia era simples, gerar um arquivo de template (.rhtml) que fosse usado por uma action. Criei a action "atom" dentro do controller "mostrar" e tudo o que eu precisava era gerar o arquivo "atom.rhtml" no lugar correto (app/views/mostrar/) para a mágica acontecer!

Gerar o arquivo estático foi bastante simples. Primeiramente eu quis saber em qual diretório eu estava, com o método (unix-like) [FileUtils.]pwd.

A partir do caminho atual, eu construí o caminho completo até o diretório final aonde o arquivo iria ser gerado e mandei abrir o arquivo para escrita (usando as funções para arquivos):

feed = File.new "#{FileUtils.pwd}/app/views/mostrar/atom.rhtml", 'w'

Depois foi só adicionar o conteúdo (fazendo uma iteração na collection de posts) e fechar o arquivo. Exemplo didático:

feed = File.new "#{FileUtils.pwd}/app/views/mostrar/atom.rhtml", 'w'
3.times do
feed << 'Adicionando um texto qualquer no arquivo'
end
feed.close

Remover HTML em um controller

Eu resolvi que iria remover todo o HTML do resumo do post quando ele fosse colocado no feed. A missão era simples: procurar um método que fizesse isso por mim.

O Rails possui uma série de métodos que ajudam (helpers) muito na hora de criar templates. Um deles é o strip_tags, que permite remover todas as tags de um documento.

Apliquei o método no código que gera o arquivo e quando rodei ele recebi a mensagem:

undefined method 'strip_tags'

Não era exatamente o que eu esperava. =) Com um pouco de pesquisa descobri que tal método era um helper e por isso só estava disponível nos templates.

E agora? Será que vou ter de duplicar o método numa versão para controllers? Não! Com mais um pouco de pesquisa encontrei a solução. Este código permite usar os helpers nos controllers bastando prefixá-los com "help".

Resumindo

Juntando isso tudo (não precisa bater no liquidificador! =) eu tinha o feed pronto para divulgação. Se quiser ver como ele ficou: http://feeds.feedburner.com/klauspaiva

E não se esqueça, este é um método, não o método para se gerar arquivos estáticos (ou feeds). Sugestões e idéias são bem-vindas! :D

Referências
Ruby
Rails
Atom
Definindo o content-type
Condições no before_filter (veja a parte: Filter conditions)
Funções para arquivos
Funções para o sistema de arquivos (filesystem)
Removendo HTML
Usando helpers dentro de controllers

comentários