GoogleAppEngine_GuestbookSample

GoogleAppEngine_GuestbookSample

概要

GoogleAppEngineJRubySinatra、DataMapperでデータを保存するサンプル。

HAMLとかSASSとかを使って改造してみたい。

全体作業

# 作業ディレクトリに移動
cd gae_work/
# ディレクトリを作成
mkdir guestbook
# ディレクトリに移動
cd guestbook
# 設定ファイルを作成
vi Gemfile
# 設定ファイルを作成
vi config.ru
# プログラムを作成
vi guestbook.rb
# view用のフォルダを作成
mkdir views
# viewの作成(erb形式)
vi views/index.erb
# ローカルで実行
dev_appserver.rb --address=0.0.0.0 .

設定ファイルを作成

vi Gemfile

# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem "dm-appengine"
gem "sinatra"

vi config.ru

require 'appengine-rack'
AppEngine::Rack.configure_app(
  :application => 'hogehoge',
  :version => 1)
require 'guestbook'
run Sinatra::Application

プログラムを作成

vi guestbook.rb

require 'sinatra'
require 'dm-core'

# Configure DataMapper to use the Appengine datastore
# DataMapperの環境設定
DataMapper.setup(:default, "appengine://auto")

# model class の作成 / プロパティの宣言
class Shout
  include DataMapper::Resource

  property :id, Serial # required for DataMapper
  property :message, Text
end

# Make sure our template can use <%=h
# テンプレートで使用する、escapeのエイリアスを作る
helpers do
  include Rack::Utils
  alias_method :h, :escape_html
end

# 画面の表示
get '/' do
  # Just list all the shouts
  # 読み取り
  @shouts = Shout.all
  erb :index
end

# POST後の処理
post '/' do
  # Create a new shout and redirect back to the list.
  # 作成
  shout = Shout.create(:message => params[:message])
  redirect '/'
end

viewの作成(erb形式)

vi views/index.erb

<% @shouts.each do |shout| %>
<p>Someone wrote, <q><%=h shout.message %></q></p>
<% end %>

<form method=post>
<textarea name="message"></textarea>
<input type=submit value=Shout>
</form>

参考資料

Google Code Archive - Long-term storage for Google Code Project Hosting.

DataMapper を使う - KrdLab's blog

DataMapperの使い方

DM-Coreでサポートするデータ型(GAEで使えるかは未調査)

TrueClass, Boolean, String, Text, Float, Fixnum, Integer, BigDecimal, DateTime, Date, Time, Object, (marshalled)

Discriminator (all you need for Single Table Inheritance, actually)