おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

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ではないらしい。
ビューはとりあえずこんな感じかな。