Kalendarze w Railsach
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.

Tagi: web-design, webdev
October 24th, 2006 at 22:25
a gdzie jakis mily zrzucik ekranu ?;)
December 6th, 2006 at 16:20
Proszę bardzo ;)