先週の金曜の深夜に何故かひらめいてpythonはじめたとき放置してたGAEjの方をアップしておきます。
% sudo port install jruby
% sudo gem install google-appengine
% mkdir hello-gae-sinatra-dm-haml
% cd hello-gae-sinatra-dm-haml
必要なファイル・ディレクトリを自動作成しつつ各種gemを入れます。(カレントディレクトリの.gem以下に入る)
% appcfg.rb gem install sinatra dm-appengine addressable extlib haml
% vi config.ru
require 'appengine-rack'
AppEngine::Rack.configure_app(
:application => 'application-id',
:version => 1)
require 'application'
run Sinatra::Application
% vi application.rb
require 'rubygems'
require 'sinatra'
require 'dm-core'
require 'haml'
require 'sass'
DataMapper.setup(:default, "appengine://auto")
class Post
include DataMapper::Resource
property :id, Serial
property :body, Text
end
helpers do
include Rack::Utils
alias_method :h, :escape_html
end
get '/' do
@posts = Post.all
haml :index
end
post '/' do
post = Post.create(params[:post])
redirect '/'
end
get '/stylesheet.css' do
content_type 'text/css', :charset => 'utf-8'
sass :stylesheet
end
DataMapperパターンはActiveRecordパターンより抽象度が高いのでadapterさえあればKVSにも対応可能。凄いですね。
% mkdir views
% vi views/index.haml
!!! XML
!!!
%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "ja", :lang => "ja"}
%head
%title Guestbook using GAEj Sinatra DataMapper Haml
%link{:href => "/stylesheet.css", :rel => "stylesheet", :type => "text/css", :media => "screen"}
%body
%form{:action => "/", :method => "post"}
%input{:type => "text", :name => "post[body]"}
%input{:type => "submit"}
%ul
- @posts.each do |post|
%li
= post.body
% vi views/stylesheet.sass
body
:font
:size 42px
最終的なディレクトリ構成はこんな感じ。
% tree
.
|-- WEB-INF
| |-- appengine-generated
| | |-- build_status.yaml
| | |-- datastore-indexes-auto.xml
| | `-- local_db.bin
| |-- appengine-web.xml
| |-- lib
| | |-- appengine-api-1.0-sdk-1.2.5.jar
| | |-- appengine-jruby-0.0.4.jar
| | |-- appengine-jruby-rubygems-0.0.4.jar
| | |-- gems.jar
| | `-- jruby-rack-0.9.5.jar
| `-- web.xml
|-- application.rb
|-- config.ru
|-- public
`-- views
|-- index.haml
`-- stylesheet.sass
必要なファイルは殆ど自動生成(or コピー)してくれてます。
% dev_appserver.rb .
日本語が文字化けるのは謎。