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!
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,
nly => :atom
A parte adicional está em negrito. Muito simples, muito prático.
(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!
- 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