Home > Blog > Kalendarze w Railsach

Kalendarze w Railsach

Published on 19/10/06
by Kuba Filipowski

Dziś zajmiemy się wygenerowaniem kalendarza w aplikacji RoR przy pomocy pluginu “Calendar Heleper”.

Instalacja:
script/plugin install http://topfunky.net/svn/plugins/calendar_helper/

Wygenerujmy sobie też jakiś przykładowy kontroler
script/generate controller calendar show view_event

I w widoku wstawimy taki kod:
<%= calendar({:year => @year, :month => @month}) do |d|
cell_text = "#{d.mday}"
cell_attrs = {:class => 'day'}
@events.each do |e|
if e.starts_at.mday == d.mday && e.starts_at.month == d.month && e.starts_at.year == d.year
cell_text = link_to "#{d.mday}", {:action=>'view_event', :id=>e.id}, :id=>e.id
cell_attrs[:class] = 'specialDay'
end
end
[cell_text, cell_attrs]
end
%>


Jeśli komus zależy tylko na kalendarzu może wpisać poprostu:
<%= calendar({:year => @year, :month => @month})%>
ale my posuniemy się o krok, a może nawet 2, dalej.

Najpierw stworzymy tabelkę w bazie danych:

CREATE TABLE `events` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) default NULL,
`description` text,
`starts_at` datetime default NULL,
`created_on` datetime default NULL,
PRIMARY KEY (`id`)
);

I model:
script/generate model Event

Kod generujący kalendarz, który wpisaliśmy (albo skopiowaliśmy ;P) przed chwilą, zaznacza dni, w których “coś się dzieje”, więc trzeba go nakarmić danymi z bazy (wpisz to do do akcji show):

if @params[:year]!=nil then
@year = @params[:year].to_i
else
@year = Time.now.year
end
if @params[:month]!=nil then
@month = @params[:month].to_i
else
@month = Time.now.month
end
@events = Event.find(:all)

Ten kod przy okazji sprawdza czy zostały podane parametry odpowiedzialne za rok i miesiąc kalendarza, jeśli nie to wyświetla kalendarz na bieżący miesiąc.

Musimy jeszcze ustawić ścieżki w routes.rb:
map.connect 'events/date/:year/:month', :controller => 'events', :action => 'show'

Oczywiście trzeba zajęć sie jeszcze akcją view_event.
Kod akcji:
@id = params[:id]
@event = Event.find(params[:id])

I widok:
<ul id="eventlist">
<li>[<strong><%= @event.title %></strong>]
<%= @event.description %>
<small>(<%= @event.starts_at.strftime('%d-%m-%Y') %>)</small>
</li>
</ul>

Teraz dodaj kilka wydarzeń do bazy i sprawdź czy Twój kalendarz działa jak należy, jeśli nie to powtórz wszystkie kroki od początku.

Teraz zabierzemy się za integrację kalendarza z AJAXem – w railsach nie jest to specjalnie trudne – wystarczy zamienić link_to na link_to_remote("#{d.mday}", :update=>'events_box', :url=>{:action=>'view_event', :id=e.id})

Należy jeszcze w sekcji head widoku wpisać: <%= javascript_include_tag "prototype" %>, nie można także zapomnieć o dodaniu w sekcji body <div id="events_box"></div>

I to wszystko – wydarzenia będą pokazywać się bez przeładowania strony.

Ambitni mogą użyć pluginu stąd UJS, aby zdarzenia kliknięcia na link z wydarzeniem były dodawane w dyskretny sposób.

Jeżeli coś przeoczyłem, lub gdzieś się pomyliłem liczę na feedback w komentarzach lub na adres team[at]yashke.com.

kalendarz-ruby.gif

Co dalej?

Proszę skometuj ten tekst - jestem ciekawy co o nim myślisz. Możesz też podlinkować swój wpis używając trackbacku: Kalendarze w Railsach.