DynamicCalendarHelper を試してみる

どういった経緯でこれがあるのを知ったのか忘却の彼方ですが、google notebook に情報の断片が残存しておりましたので、実装試験を。
とりあえず、ココ から webcalendar.zip をオとしておく。できれば解凍も。

プロジェクト作成

webcal という rails プロジェクトを作成。

$ ruby rails/railties/bin/rails webcal
$ cp rails webcal/vendor/. -r

DB 作成

DB のサービスが動いているホストで DB を作成。名前は web_calendar_dev とし、接続ユーザなんかは適当。

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 77 to server version: 5.0.22-Debian_2bpo1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database web_calendar_dev default character set utf8 ;
Query OK, 1 row affected (0.15 sec)

mysql> grant all privileges on web_calendar_dev.* to xxx@172.16.100.4 identified by 'xxx' ;
Query OK, 0 rows affected (0.25 sec)

mysql> \q
Bye
$

クライアント側からの接続試験は略。config/database.yml も修正しておく。

scaffold 使って event コントローラを作成

えーと、rails が webcal/vendor/ 配下にコピられていないと、./script/generate とかがきちんと動かない事を発見。知らんかったよ。しかも scaffold 作成時にはテーブルがねぇと駄目なのか。

てコトで events テーブル作成しときます。マンドくせぇのでサーバ側で。

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 80 to server version: 5.0.22-Debian_2bpo1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> connect web_calendar_dev ;
Connection id:    81
Current database: web_calendar_dev

mysql> create table `events` (
    ->   `id` int(11) NOT NULL auto_increment,
    ->   `name` varchar(255) default NULL,
    ->   `description` text,
    ->   `startdate` date default NULL,
    ->   PRIMARY KEY  (`id`)
    -> ) TYPE=MyISAM ;
Query OK, 0 rows affected, 1 warning (0.15 sec)

mysql> \q
Bye
$

で generate を。

$ ./script/generate scaffold Event
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/events
      exists  test/functional/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/event.rb
      create    test/unit/event_test.rb
      create    test/fixtures/events.yml
      create  app/views/events/_form.rhtml
      create  app/views/events/list.rhtml
      create  app/views/events/show.rhtml
      create  app/views/events/new.rhtml
      create  app/views/events/edit.rhtml
      create  app/controllers/events_controller.rb
      create  test/functional/events_controller_test.rb
      create  app/helpers/events_helper.rb
      create  app/views/layouts/events.rhtml
      create  public/stylesheets/scaffold.css
$

一応動作の確認はしておきましょう。

calendar コントローラの作成

$ ./script/generate controller calendar
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/calendar
      exists  test/functional/
      create  app/controllers/calendar_controller.rb
      create  test/functional/calendar_controller_test.rb
      create  app/helpers/calendar_helper.rb
$

で、最初に download しておいた webcalendar.zip を解凍したフォルダ内の app/helpers/ に calendar_helper.rb があるのでコピーをしておく。(コマンドは略)
又、app/views/layouts/application.rhtml と public/stylesheets/calendar.css も取得しておく必要あり。

その後、calendar_controller.rb の index アクションを以下のように修正。(webcalendar.zip に同梱)

app/controllers/calendar_controller.rb

class CalendarController < ApplicationController

  def index
    @year = @params[:year].to_i
    @month = @params[:month].to_i

    events = Event.find_all

    @databinder = lambda do |d| 
      cell_text = "#{d.mday}<br />"
      cell_attrs = {:class => 'day'}
      events.each do |e|
        if e.startdate == d
          cell_text << e.name << "<br />"
          cell_attrs[:class] = 'specialDay'
        end
      end
      [cell_text, cell_attrs]
    end
  end

end

又、ビューも作成しておく。(これも同様に webcalendar.zip に同梱)

app/views/calendar/index.rhtml

<h1>Dynamic Calendar Example</h1>
<%= calendar({:year => @year, :month => @month, :abbrev => (0..-1)}, &@databinder) %>

これでサーバを起動すればカレンダ表示のみの雛形は表示可能。

で、config/routes.rb に以下のナニを追加して試験してみたんですが,DirectoryIndex のみ NG で (public/index.html が表示) なんでよー、と思っていたらコメントに public/index.html 消せって書いてるし (鬱

  # You can have the root of your site routed by hooking up '' 
  # -- just remember to delete public/index.html.
  # map.connect '', :controller => "welcome"

(config/routes.rb より引用)

とりあえず、public/index.html をリネイムしたら動きますた。しばらくこれをいじくり回すことにします。(しまった。テーブルは migrate で作るべきだった)