Posterous theme by Cory Watilo

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.
Media_httpyashkecomwp_qaide