コントローラを作る
前回までに、
まずはWordコントローラを作ってみましょう。前回、
default.rbを元に戻す
まず、
def all; model.order(:created_on.desc).all; end
def find( name ); model[ :id => name ] or not_found; end
def all; model.all; end
def find( name ); model[ :name => name ] or not_found; end
この変更により、
Wordコントローラを作る
rake generate:controller name=word
生成されたcontrollers/
WavesのREST動作
前回も簡単に述べましたが、
include Waves::Mapping::PrettyUrls::RestRule
RestRuleをincludeすると、
POST /リソース # 新しいリソースを追加する
POST /リソース/名前 # 指定の名前のリソースを更新する
DELETE /リソース/名前 # 指定の名前のリソースを削除する
Twアプリケーションで'/words'というURLに対してフォームの内容をPOSTすると、
include Waves::Mapping::PrettyUrls::GetRules
GetRulesをincludeすると、
/リソース(複数形) # リソースの全リストを取得する
/リソース/名前 # 指定の名前のリソースを取得する
/リソース/名前/editor # 指定のリソースの編集画面を呼び出す
Twアプリケーションで'/words'というURLを呼び出すと、
ユーザと関連を追加する
Twアプリケーションは今のままではアクセスした人の発言がそのままリストされるだけなので、
Userモデルを追加する
次に認証を追加することを考慮して、
rake schema:migration name=add_user
schema/
class AddUsers < Sequel::Migration
def up
create_table :users do
primary_key :id
text :name, :unique => true, :null => false
text :password, :null => false
end
add_column :words, :user_id, :foreign_key, :table => :users
end
def down
drop_table :users
drop_column :words, :user_id
end
end
Usersテーブルはid、
rake generate:model name=word rake generate:model name=user
models/
module Tw
module Models
class Word < Sequel::Model(:words)
many_to_one :user, :class=>Tw::Models::User
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
一人のユーザが複数の発言を所有するので
認証を追加する
認証機能を追加して、
設定ファイル(configrations/development.rb)の修正
RackはWavesでWebサーバの抽象化を担うライブラリです。configrations/
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::Auth::Basic do |username, password|
u = Tw::Models::User.find(:name=>username)
u && u.password == password
end
use Rack::Static, :urls => ['/css', '/javascript'], :root => 'public'
use Rack::ShowExceptions
run Waves::Dispatchers::Default.new
end
end
end
end
「use Rack::Auth::Basic」
スタティックファイルの処理
また
さてこれでとりあえず認証画面が出るようになったはずです。ブラウザから
ビューを修正する
ユーザと発言には一対多の関連を設定しました。次に発言をPOSTするとき、
発言をPOSTするときにユーザidを設定する
layout :default, :title=>'Tw' do
@user = Tw::Models::User[:name=>request.env['REMOTE_USER']]
form :action=>'/words', :method=>'post' do
textarea '', :name=>'word.text', :cols=>80, :class=>'words'; br
input :type=>:hidden, :name=>'word.user_id', :value=>@user.id
input :type=>:submit, :value=>'Update'
end
@words.each do |word|
view :word, :summary, :word=>word, :user=>@user
end
end
まず
ここで/wordsに対してPOSTすればレコードの生成になるのは前述したとおりです。
またsummaryテンプレートに
Markabyテンプレート
ここまでWavesのデフォルトのテンプレートライブラリであるMarkabyについて、
Markabyはこうした独自の記法をまったく使わず、
html do
head do
title 'Products: ' + action_name
stylesheet_link_tag 'scaffold'
end
body do
p flash[:notice], :style => "color: green"
self << content_for_layout
end
end
Markabyでは、
要素のクラスとIDの指定には特別な記法が用意されています。contentsクラスのdiv要素なら
Wavesの各コンポーネントはドキュメントが少ないのが弱点なのですが、
summaryテンプレートを修正する
以下のように修正します。各要素に適当なクラスを設定して、
div.text do
table(:class=>(@word.user.name==@user.name)?'mywords':'words') do
tr do
td.name(:rowspan=>2, :style=>'width:20%;') {@word.user.name}
td.word {@word.text}
end
tr do
td.date {@word.created_on.strftime("%Y-%m-%d %H:%M") if @word.created_on}
end
end
end
あとは適当なcssを設定すれば見栄えを変えることができるようになりました。
public/
body {
padding: 2em;
}
table.words {
margin: 2px;
width: 600px;
border: 1px dotted orange;
}
table.mywords {
margin: 2px;
width: 600px;
border: 1px solid orange;
}
table.words tr {}
table.words td,
table.mywords td {
padding: 2px 10px;
}
まとめと次回の予定
ユーザの認証、