Webフレームワークの新しい波 Waves探訪記

第3回 シンプルなWebアプリを作る(その1)

この記事を読むのに必要な時間:およそ 4.5 分

Waves-console

Rubyに付属するirbをWaves用に拡張したツールです。Wavesの機能をその場で結果を確認しながら試すことができるので大変便利です。ここれもRailsのconsoleと同じと思えばいいでしょう。以下のようにモデルを手作業で操作できます。

waves-consoleでモデルを操作する

% waves-console
irb(main):001:0> M = Tw::Models
=> Tw::Models
irb(main):002:0> M::Word.all
=> []
irb(main):003:0>

Wavesでは全てのモデルやコントローラはモジュールの名前空間で区切られています。⁠アプリ名::Models」とすることで,モデル全体含む名前空間が得られます。面白いことにwordsテーブルはありますがモデルのファイルは作っていません。それでもWordモデルを扱うことができるのは,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}>

よく見ると「created_on」が設定されていません。updated_onと異なり,こちらは自動的には設定されないようです。モデルの標準的な振る舞いはmodels/default.rbに記述されているので見てみましょう。

モデルのデフォルトの振る舞い

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_onはここで設定されていますが,created_onはそうなっていません。これはバグなのかどうか判然としませんが,修正は簡単です。以下のようにします。

レコードの作成日付を保存する

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

これでレコードの作成日付が保存されるようになります。

ビューを作る

ではビューを作って,wordsテーブルに保存した内容を見られるようにしてみましょう。templates/word/list.mabを作って,以下のようにします。

一覧表示用のテンプレート

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(Ruby言語でテンプレートを記述できるシステム)です。

前半が新規にエントリを追加するためのフォーム,後半がWordの各エントリに対して別のビューであるsummaryを呼び出しています。ここでは先に後半を説明します。

著者プロフィール

松永肇一(まつながけいいち)

株式会社ライフメディア 創造推進部プロジェクトマネージャ。東京都出身。千葉大学工学部での卒論テーマは人工知能関連だったが,富士通に入社後はPCのソフトウェア開発に関わる。"GNU for Towns"のために,リチャード・ストールマンに会いにいくような妙な仕事を経て現職。Ruby on Railsを使ってWebアプリを開発する毎日。ブログは「ma2の日記」。

URLhttp://d.hatena.ne.jp/ma2/