Wavesを試してみる - View編

Tsukasa OISHI

 昨日に引き続き、webフレームワークのWavesを試してみます。今日はビューから。
 ビューのファイルはtemplatesディレクトリ下にあるみたい。チュートリアルでは、entry用のビューのためにentryディレクトリを作れと書いてある。

mkdir templates/entry

で、このtemplatesディレクトリ下にはlayoutsディレクトリとerrorsディレクトリが存在しているのだけど、名前から想像できるようにlayouts/default.mabが、Railsでいうapp/views/layouts/application.html.erbに該当するみたい。

doctype :html4_strict

html do

  head do
    title @title
  end

  body do
    layout_content
  end

end

えっと、これはなんだろう。気づいてみれば、拡張子も.mabとなっている。やっていることは見れば理解できるけど…。
どうやらこれはMarkabyというRubyっぽいテンプレートエンジンだそうです( Markup as Rubyの略らしい)。これは簡潔でいいね。と、言いたいところだけど、これってデザイナさんは置いてけぼりだ。ひとりで開発するなら全然ありだけど、チーム開発では難しいかな。WavesはMarkabyの他にもErubisをサポートしているので、そっちを使うのもいいかも。
 でもぼくはErubisよりもMarkabyが使いたいと思っているようなのでこのまま進めます。
 チュートリアルでは、templates/entry/list.mabとして以下のコードを書けと言っている。

layout :default, :title => 'Blog Entries' do
  h1 'My Blog'
  @entries.each do |entry|
    view :entry, :summary, :entry => entry
  end
end

 layoutというヘルパーが、default.mabでのlayout_contentにyieldされるみたい。Railsとちがって、これは指定してあげないといけないみたい。ここで引数に:title を指定しているけど、これがdefault.rbでは@titleになるんだな。
 @entriesには、Entryモデルのデータが勝手に入っているらしい。コントローラでモデルから取り出すわけじゃないの? 詳細はのちほどと書かれているので、とりあえずスルーしておこう。
 そしてイテレータブロックの中のviewヘルパーが、Railsでいうところの render に当たるようだ。 これは、Railsで書くならこんな感じのことを意味しているみたい。

  <%= render :partial => "entry/summary", :locals => {:entry => entry} %>

さて、呼び出され側のsummary.mabは以下のとおり。

h2 do
  a @entry.title, :href => "/entry/#{@entry.name}" 
end
textile @entry.summary
a 'Read more ...', :href => "/entry/#{@entry.name}"

内容は見てのとおり。URLがRailsとは違ってid値を使っていない。個人的にはこっちのほうが好みだけど、この場合だとブログの記事名をユニークにしないといけなくるなる。まいっか。
textileというヘルパがよくわからないけど、ちゃんと説明がない。とりあえずスルー。

ビューに関しては以上。で、サーバを起動する。

waves-server

おー立ち上がった。デフォルトのポート番号は3000。このwebサーバはなんだろう。独自のものなのかな。URLは /entries。間違って、/entryにアクセスしたらカラフルなエラーページが表示された。カッコいい。

で、まだshowの画面がないので作れと書いてある。

layout :default, :title => @entry.title do
  h1 @entry.title
  textile @entry.content
end

これでとりあえずは動きます。コントローラやURLルーティングはいつ書くんだ。というか書かなくてもこのくらいは動くんだね。

それからcreate。チュートリアルではlist.mabにフォームを追加しているけど、そこはviewを使って書いてみた。

layout :default, :title => 'Blog Entries' do
  h1 'My Blog'

  view :entry, :form

  @entries.each do |entry|
    view :entry, :summary, :entry => entry
  end
end

form.mabは、

form :action => '/entries', :method => 'post' do
  label 'Name'
  input :type => :text, :name => 'entry.name'
  input :type => :submit, :value => 'Add'
end

こんな感じ。Rails同様、WavesもRESTfulなURLを採用しているみたいで、createはリストに対してpostメソッドを送っている。
それから編集用のページをeditor.mabとして作成してみる。

layout :default, :title => 'Edit Entry' do
  form :action => "/entry/#{@entry.name}/", :method => 'POST' do
    label 'Title'; br
    input :type => :text, :value => @entry.title, :name => 'entry.title'; br
    label 'Summary'; br
    textarea @entry.summary, :name => 'entry.summary', :rows => 10, :cols => 80; br
    label 'Content'; br
    textarea @entry.content, :name => 'entry.content', :rows => 20, :cols => 80; br
    input :type => :submit, :value => 'Save'
  end
end

ここでは、個別のentryに対してpostメソッドを送っている。RailsみたいにPUTではないらしい。
ビューはとりあえずこんな感じかな。