Wavesを試してみる - View編
昨日に引き続き、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ではないらしい。
ビューはとりあえずこんな感じかな。