にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

Heroku+Sinatra+Haml+DataMapperで簡単自分用ブックマークサイト

前にHeroku+Git+Sinatraで簡単Webアプリというエントリを書いてから、全然Sinatraを触っていなかったので、後述するサイトを参考にしながら、一人用ブックマークサイトを作ってみた。今回は主にビューのHamlとモデルのDataMapperを組み合わせて使ってみるのが目的。(といっても、参考エントリのコードに多少手を入れただけだけども)

コード

hitoribookmark.rb
require 'rubygems'
require 'sinatra'
require 'dm-core'
require 'haml'

DataMapper::setup(:default, ENV['DATABASE_URL'] || 'sqlite3:db.sqlite3')

### class definition ###

class Post
  include DataMapper::Resource
  property :id,         Serial # key
  property :title,      Text
  property :url,        Text
  property :comment,    Text
  property :used,       Boolean,  :default => false
  property :created_at, DateTime, :default => DateTime.now
  auto_upgrade!
end

### action ###

get '/' do
  @posts = Post.all(:order => [:id.desc], :used => false)
  haml :index
end

get '/deleteall' do
  @posts = Post.all(:used => false)
  @posts.each do |p|
    p.attribute_set(:used, true)
    p.save
  end
  redirect "/"
end

post "/" do
  Post.create(params)
  redirect "/"
end

__END__
views/index.haml
-# @@ index
!!! XML
!!!
%html
  %head
    %meta{ 'http-equiv' => 'content', |
    :content => 'text/html; charset=utf-8'} |
  %body
    %h1 ひとりブックマーク
    %div#showfield
      - @posts.each do |post|
        %h2
          %a{:href => post.url, :target => '__blank'}= post.title
        .p_comment= post.comment
        .p_date= post.created_at.to_s

    %form#postform{:method => :post}
      %fieldset
        %legend 新規追加
        %dl
          %dt URL:
          %dd
            %input{:type => :text, :name => :url}
          %dt Title:
          %dd
            %input{:type => :text, :name => :title}
          %dt Comment:
          %dd
            %textarea{:name => :comment}
        %input{:type => :submit, :value => "Post"}
    %form#deleteform{:action => '/deleteall', :method => :get}
      %fieldset
        %input{:type => :submit, :value => "Delete All"}
config.ru
require 'hitoribookmark'
run Sinatra::Application

というわけで、

上記のコードを書いて、前記エントリの手順でデプロイすると、こんな感じになります。データを削除するのにフラグを立てているだけなので、ちゃんとDBから削除したい場合は少し修正が必要。
それにしても、HamlといいDataMapperといい、使いやすくていいですね。Webプログラマーでないのでこういう簡素な書き方が出来るのはうれしい。SQLクエリとかXMLのタグが乱舞してるのは苦手。