14th Tue
Sinatra+DataMapper+Heroku
Merbの開発がなかなか進展しないのでSinatraをちょっと触ってみたところ、
DataMapper、Herokuとの組み合わせが非常に簡単でいい感じでした。
blog.rb
ruby>>
require "rubygems"
require "sinatra"
require "dm-core"
require "haml"
DataMapper::setup(:default, ENV['DATABASE_URL'] || 'sqlite3:db.sqlite3')
class Post
include DataMapper::Resource
property :id, Serial
property :content, Text
auto_upgrade!
end
get "/" do
@posts = Post.all(:order => [:id.desc])
haml :index
end
post "/" do
Post.create(params)
redirect "/"
end
END
@@ index
%h1 Hello, Sinatra!
%ul
- @posts.each do |post|
%li= post.content
%form{:method => :post}
%textarea{:name => :content}
%input{:type => :submit, :value => "Post"}
<<--
config.ru
ruby>>
require "blog.rb"
run Sinatra::Application
<<--
ローカルで起動するには
pre>>
% ruby blog.rb
<<--
もしくは
pre>>
% rack
<<--
でok. rubyの場合はhttp://localhost:4567、Rackの場合は http://localhost:9292 にアクセス。
これをHerokuにデプロイすると、
http://sinatora-blog.heroku.com/
こんな感じで動きます。
posted by
genki on Tue 14 Jul 2009 at 14:56 with 2 comments
ちなみに、こまかいのですが、このまま $ ruby blog.rb した時、sqlite3ファイルが保存されない(というか生成されない)現象が手元で出ました。(dm-core-0.9.11あたり) DataMapperのログにも何も出ないので、DataMapperのコード追ってみたところ、
DataObjects::URI.parse("sqlite3://db.sqlite3").path # => ""
というのが原因のようです。(この path の値で sqlite3_open しているので、この場合、空文字列のファイル名でファイル生成とかになってるのかな。。)
ので、この場合スキーマの定義は
"sqlite3://#{Dir.pwd}/db.sqlite3"
とかしたほうがよさげです。
おお、どうもです!
修正しておきました。