作成するアプリケーションの概要
今回から、
今回使っているシステムはOSがFedora 7
Wavesコマンドでアプリのひながたを作る
Twitter風のアプリケーションということで、
waves tw
wavesコマンドを実行したディレクトリに、
Wavesコマンドのバグ対応
バージョン0.
lib/tasks/schema.rb   
この中の8行目付近に
lib/tw.lib  
44行目付近にある
textileメソッドは日本語に非対応
Wiki風のマークアップを解釈してくれるtextileメソッドがビューで使えるのですが、
データベースの設定とテーブル作成
データベースの設定
まずデータベースを設定します。configurations/
module Tw
  module Configurations
    class Development < Default
    
      database :host=>'localhost', :adapter=>'sqlite', :database=>'db/tw_dev'
      host '0.0.0.0'
      port 3000
      reloadable [ Tw ]
      log :level => :debug  
      application do
        use Rack::ShowExceptions
        run Waves::Dispatchers::Default.new
      end
    end
  end
end
hostは接続するホストのIPアドレスを制限します。デフォルトは'127.
マイグレーション
まずマイグレーション用のベースを作成します。
以下のコマンドを実行すると、
rake schema:migration name=initial_schema
次に実際のテーブル情報を設定します。個々の発言はwordテーブルに格納することにします。schema/
class InitialSchema < Sequel::Migration
  def up
    create_table :words do
      primary_key :id
      text :text
      timestamp :created_on
      timestamp :updated_on
    end
  end
  
  def down
    drop_table :words
  end
end
最後にマイグレーションを実行すると、
rake schema:migrate
ここまでやると、
Waves-console
Rubyに付属するirbをWaves用に拡張したツールです。Wavesの機能をその場で結果を確認しながら試すことができるので大変便利です。ここれもRailsのconsoleと同じと思えばいいでしょう。以下のようにモデルを手作業で操作できます。
% waves-console irb(main):001:0> M = Tw::Models => Tw::Models irb(main):002:0> M::Word.all => [] irb(main):003:0>
Wavesでは全てのモデルやコントローラはモジュールの名前空間で区切られています。
新しいエントリを作ることもできます。
irb(main):010:0> M::Word.create(:text=>'test entry')
=> #<Tw::Models::Word @values={:text=>"test entry", :created_on=>nil, :updated_on=>Thu Apr 24 23:39:15 +0900 2008, :id=>1}>
よく見ると
module Tw
  module Models
    class Default < Sequel::Model     
      before_save do
        set(:updated_on => Time.now) if columns.include? :updated_on
      end
    end
  end
end
updated_
module Tw
  module Models
    class Default < Sequel::Model
      after_create do
        set(:created_on => Time.now) if columns.include? :created_on
      end
      before_save do
        set(:updated_on => Time.now) if columns.include? :updated_on
      end
    end
  end
end
これでレコードの作成日付が保存されるようになります。
ビューを作る
ではビューを作って、
layout :default, :title=>'Tw' do
  form :action=>'/words', :method=>'post' do
    textarea '', :name=>'word.text', :cols=>80, :class=>'words'; br
    input :type=>:submit, :value=>'Update'
  end
  @words.each do |word|
    view :word, :summary, :word=>word
  end
end
見た目テンプレートと言ってもRubyのコードそのものです。これがMarkaby
前半が新規にエントリを追加するためのフォーム、
一覧の表示
モデルWordの全レコードは@wordsとして自動的に設定されます。
viewメソッドは、
したがって、
div.text do
  p @word.text
  p.date @word.created_on.strftime("%Y-%m-%d %H:%M") if @word.created_on
end
summaryビューは他のビューから呼ばれることを前提にしているので、
これで一覧が表示できるようになります。URLとしては/word/
テスト実行してみる
ちょっと動作を確認してみましょう。waves-serverコマンドを使って、
tw% waves-server I, [2008-04-24T23:41:36.589731 #17044] INFO -- : ** Waves Server Starting ... I, [2008-04-24T23:41:36.617656 #17044] INFO -- : ** Waves Server Running on 0.0.0.0:3000 I, [2008-04-24T23:41:36.618151 #17044] INFO -- : Server started in 27 ms.
ブラウザから
エントリの追加
フォームは
ここで注意すべきなのは、
さて実際にエントリを追加してみるとエラーになります。デフォルトの振る舞いとして、
レコード追加後に一覧に戻る
レコード追加後に一覧に戻るようにするにはconfigurations/
module Tw
  module Configurations
    module Mapping
      extend Waves::Mapping
      # your custom rules go here
      path %r{^/words/?$}, :method=>:post do
        use(:word)
        word = controller{create}
        redirect('/words')
      end
      include Waves::Mapping::PrettyUrls::RestRules
      include Waves::Mapping::PrettyUrls::GetRules
    end
  end
end
pathメソッド以降が新たに追加した部分です。
まずpathのパラメータとしてカスタム処理を設定したいURLを正規表現の形で記述します。今回は/entriesにポストしたときの振る舞いなので
これでエントリを追加できるようになりました。
コントローラの振る舞いを変える
エントリの一覧ではなく、
コントローラにはデフォルトの振る舞いを記述してあるファイルがあります。controllers/
個別のエントリの表示
templates/
layout :default, :title=>@word.id do
  p @word.text
  a 'home', :href=>'/words'
end
これで
まとめと次回の予定
Wavesの強力なデフォルト機能と、
次回は認証機能などを追加していきます。