Exibindo calendários com o plugin has_calendar no Ruby on Rails
17 de Setembro de 2008
O novo Spesa está sendo desenvolvido em ritmo acelerado — isso significa que ando trabalhando muito nas minhas horas vagas — e diversas funcionalidades que estou implementando estão sendo extraídas na forma de plugins.
O mais recente deles é o has_calendar, que permite exibir calendários com eventos de maneira muito simples.
A minha idéia, já que não uso Windows nem para desenvolvimento, nem para (sic) produção,
foi utilizar o comando cal, disponível em sistemas *nix, evitando toda a
complexidade de ter que se trabalhar com datas. Para deixar explicíto, este plugin não
irá funcionar no Windows.
Usando o plugin
Primeiro, você terá que instalar o plugin.
Para isso, execute o comando script/plugin install git://github.com/fnando/has_calendar.git.
Se você quiser exibir um calendário sem eventos, pode simplesmente chamar o helper calendar.
<%= calendar %>
Se quiser especificar um mês específico, pode passar um hash com algumas opções.
<%= calendar :year => 2008, :month => 9 %>
O dia atual é diferenciado e não exibe o número; em vez disso o texto "TODAY" é colocado no lugar.
Se quiser substituir esta mensagem, utilize a opção :today.
<%= calendar :today => 'HOJE' %>
Para adicionar eventos, você deve passar um bloco, que receberá um objeto Date referente ao dia do calendário.
Assim, você pode realizar consultas relacionadas a esta data e exibí-las da maneira que achar melhor.
<% calendar do |date| %>
<% for schedule in Schedule.by_date(date) %>
<%= link_to schedule.title, schedule_path(schedule) %>
<% end %>
<% end %>
Como você pode perceber, isso faria até 31 consultas ao banco de dados (uma para cada dia da semana) se você não otimizasse seu código (embora eu tenha escrito o artigo assim para facilitar, minha idéia de uso ia ser totalmente diferente). Pensando nisso após ler o comentário do Carlos, decidi que seria melhor implementar uma forma onde apenas o resultado de uma consulta fosse informado.
No template, você pode definir a opção :events, passando o resultado de sua consulta. O bloco, que antes recebia a data, agora
receberá também todos os registros específicos daquele dia.
<% calendar :events => Schedule.all, :field => :scheduled_at do |date, events| %>
<% for schedule in events %>
<%= link_to schedule.title, schedule_path(schedule) %>
<% end %>
<% end %>
Melhorando a apresentação do calendário
Para formatar o calendário, você pode usar este CSS como ponto de partida.
#calendar {
border-collapse: collapse;
width: 100%;
}
#calendar td,
#calendar th {
color: #ccc;
font-family: "Lucida Grande",arial,helvetica,sans-serif;
font-size: 10px;
padding: 6px;
}
#calendar th {
border: 1px solid #ccc;
background: #ccc;
color: #666;
text-align: left;
}
#calendar td {
background: #f0f0f0;
border: 1px solid #ddd;
}
#calendar span {
display: block;
}
#calendar td.events {
background: #fff;
}
#calendar td.today {
background: #ffc;
color: #666;
}
#calendar caption {
display: none;
}
Ele irá se parecer com isto:
Mais simples, impossível! ;)
NOTA: O Mac OS X não permite iniciar a semana pela segunda-feira. Sendo assim, se você desenvolve neste sistema operacional, a semana começará no domingo. Em sistemas Linux, onde a maioria das aplicações são executadas, a semana iniciará na segunda-feira.
NOTA 2: Se você quiser utilizar este plugin no Windows, certifique-se de que exista um comando cal
no seu PATH, retornando exatamente a saída do comando para *nix. Ele deve ser executado no formato cal -m 12 2008.
Teoricamente funciona. :)
UPDATE: Este artigo foi atualizado para mostrar a nova opção :events.
UPDATE 2: O Carlos sugeriu adicionar a chamada ao método da data no próprio helper. Claro que fica melhor!
Use a opção :field.
- Permalink
- Trackback
- Feed dos comentários
- Ao som de: The Cure – Close to Me
Textos escritos por
Comentários #
Nando,
Fiquei cá a pensar com meus botões: Não será possível definir se a semana iniciará na Seg. ou Dom. através do Locale do Linux?
Quando chegar em casa vou testar isso.
Que ÓTIMO saber que vem ai um novo SPESA! :D
Excelente plugin Nando! Só tenho uma pequena sugestão. Seria excelente se tivesse uma forma já built-in de fornecer um range de datas ao invés da data atual, assim evita que 30 queries sejão feitas no banco de dados em favor de apenas uma que busca todos os eventos de uma vez.
Abraços!
É... isso que dá opinar sem olhar o source:
cmd << '-m ' unless RUBY_PLATFORM =~ /darwin/
Carlos, alterei o texto para mostrar como funciona a opção :events. ;)
Eu sei que tô meio atrasado mas... ao rodar o bloco de eventos eu fico recebendo um retorno dizendo que eu tenho um nilObject... o que não é o caso... alguém passou por isso e achou uma solução? ou isso é uma loucura que acontece só comigo aqui? =)
Abraão, tem como você publicar o código que gerou o erro?
http://pastie.caboo.se/
Abraço!
Estou tentando fazer a navegação entre os meses através de links no topo do calendário em seu plugin. O Calendar Helper(http://wiki.rubyonrails.org/rails/pages/Calendar+Helper+Plugin) possui tal recurso na demonstração (http://rubyonrailsworkshops.com/dashboard/2008/10), mas que não foi disponibilizado no source.
Eu fiz a navegação para os meses fora do plugin por métodos Ajax, que controlam as variáveis de mês e ano que são setadas no ":month" e ":year".
Para minha necessidade, fiz a possibilidade de o usuário marcar um evento para si, dentro do calendário, algo como uma agenda.
Como sou iniciante, o código está ruim, e portanto gostaria de sugestões para a navegação (deve ser feita em JavaScript de dentro do Plugin ?)
Agradeço pelo plugin, está sendo de grande ajuda.
Fala Nando, fui usar e tive o mesmo problema do Abraão... andei fazendo uns debugs e cheguei na linha que faz o capture (no dia do evento), retorna \n
Colei aqui o código que estou usando:
http://gist.github.com/38017
Olá, preciso utilizar esse plugin no windows. Vi que você deu a dica de funcionamento mas não consegui entender. Dei uma pesquisada e nao encontrei nada também.
Pode dar uma ajuda a respeito da utilização desse plugin no Windows ?
Obrigado
Estava precisando exibir esse calendário no windows, então achei um código que vem junto com a instalação do Ruby, nos exemplos dos doc (pelo menos no Windows).
http://pastie.org/556290
Com ele é possível gerar o calendário igual ao do linux no windows, legal né ;-)
Agora vou alterar um pouco o código do plugin pra ver como fazer pra ele funcionar.
Assim que tiver uma solução comento aqui.
Abraços
ainda nao tive tempo pra testar, mas acho que esse eh o código:
begin
cmd = 'cal '
cmd << '-m ' unless RUBY_PLATFORM =~ /darwin/
rescue
cmd = "ruby lib/utils/cal.rb -c os "
end
* esse codigo fica no lugar do:
cmd = 'cal '
cmd << '-m ' unless RUBY_PLATFORM =~ /darwin/
* tem que colocar o cal.rb na pasta lib/utils
abraços
Eu preciso criar a table Schedule ? Quais os campos dela ? Não tem um já "pronto "?
Obrigado.
Deixe um comentário