作成するアプリケーションの概要
今回から、
今回使っているシステムは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の強力なデフォルト機能と、
次回は認証機能などを追加していきます。