続 Sinatra の MVC の M に Sequel を使ってみる

前回は DB の検索しか行わなかったので、登録、更新、削除機能を追加した。

コントローラ
require 'rubygems'
require 'sinatra'
require 'sequel'

Sequel::Model.plugin(:schema)
Sequel.connect('sqlite://myapp.db')
class Items < Sequel::Model
  unless table_exists?
    set_schema do
      primary_key :id
      string :name
      timestamp :created_at
    end
    create_table
  end
end

get '/' do
    @items = Items.all
    haml :index
end

get '/item/:id' do
    @items = Items.filter('id = ?', params[:id])
    haml :index
end

post '/item' do
    Items.create(
        :name => request[:name],
        :created_at => Time.now
        )
    redirect '/'
end

put '/item/:id' do
    Items.filter('id = ?', params[:id]).update(:name => request[:name])
    redirect '/'
end

delete '/item/:id' do
    Items.filter('id = ?', params[:id]).delete
    redirect '/'
end
ビュー

汚いなぁ。まぁ、モデルの使い方がメインなので、これはこれでよし。

!!! XML
!!!
%html
  %form{:method => "POST", :action => '/item'}
    %input{:type => "text", :name => "name"}
    %input{:type => "submit" :value => "create "}
  - @items.each do |item|
    %div
      %form{:method => "POST", :action => "/item/#{item.id}"}
        %input{:type => "hidden", :name => "_method", :value => "PUT"}
        %input{:type => "text", :name => "name", :value => item.name}
        %input{:type => "submit" :value => "update"}
      %form{:method => "POST", :action => "/item/#{item.id}"}
        %input{:type => "hidden", :name => "_method", :value => "DELETE"}
        %input{:type => "submit" :value => "delete"}
まとめ
  • Items#filter が SELECT 文になるようだ。更新、削除する場合は、filter で絞り込んだオブジェクトに対して update, delete を実行。わかり易い。
  • ブラウザからWebサーバへリクエストを送る際に、PUT、DELETEメソッドを送信できるブラウザはない。その代替手段として、パラメータ _method に "PUT" または "DELETE" を設定し、どのメソッドかを判定できるようになっている。Rails も同様らしい、知らなかった。
  • これで RESTful な作りになってるのかな。REST を意識したのはこれが初めてなので。