10分でできるPadrinoとMongoDBを使ったAPI作成

どうも、逆流性食道炎です。2月初めに胃痛で病院に行き、翌日の胃カメラで診断されました。ストレス社会に生きる皆様も、胃腸の健康には十二分にご留意ください。くれぐれも。くれぐれも。
薬物の効能によるものか症状はだいぶ緩和されているのですが、時には病める日もあります。そんな胃の状態を教えてくれるAPIをつくりました。
http://marutanm-stomach.heroku.com/condition
稚拙ですね。果たして、これから機能追加はなされるのでしょうか?
ぶっちゃけ私の胃の状態なんて誰も知ったことじゃないでしょうが、PadrinoとMongoDBを使った簡単すぎるチュートリアルとして、手順を追ってみます。URLでお分かりのように、最終的にはHerokuにデプロイします。
基本的には公式にあるチュートリアルの劣化版ですが、ActiveRecordではなくMongoDB、ORMにMongoidを使います。
ソースコードmarutanm/marutanm-stomach · GitHubに置いてあります。

プロジェクト作成

% padrino gen project marutanm_stomach  -d mongoid

PadrinoはSinatraベースではありますが、Railsライクな構成をとっており(Rails使ったことないけど知ったかぶり)コマンド一発で必要なファイルを生成してくれます。
上記は、marutanm_stomachという名前のMongoidを使ったプロジェクトを作るコマンドです。その他のオプションはPadrino公式ガイドを参照のほど。

% cd marutanm_stomach
% mkdir db
% mongod -dbpath ./db/

作成したプロジェクトのディレクトリに移動、DBの置き場所をつくってMongoDBを起動しておきます。

管理画面作成

% padrino gen admin --theme olive

プロジェクト管理用の画面を生成します。oliveは画面の配色、好みで選びました。他にも以下のような配色が用意されていて、プロジェクト内のadmin/viewsにあるlayouts/application.hamlおよびsessions/new.hamlのstylesheet_link_tagで指定されています。

% ls public/admin/stylesheets/themes/
amro           bec-green      default        kathleene      orange         ruby
bec            blue           djime-cerulean olive          reidb-greenish warehouse

起動してみる

% padrino start

http://localhost:3000 にアクセスすると、おなじみSinatraの404画面がでます。無事に起動していますね。
http://localhost:3000/admin にアクセスすると管理画面のログインページも確認できます。
f:id:marutanm:20110415234113p:image

管理用アカウント作成

% padrino rake seed

管理画面ログインに使うメールアドレス、パスワードを聞かれるのでそれぞれ入力します。パスワードはちゃんと暗号化された状態でDBに保管されます。

Model作成

% padrino gen model stomach condition:string
% padrino rake seed

上記コマンドでModelを生成します。コレクション名がstomach、唯一の要素がString型のconditionですね。ちなみにmongoコンソールから確認したところ、コレクション名は自動的に複数形のstomachesになりました。

# app/models/stomach.rb
class Stomach
  include Mongoid::Document
  include Mongoid::Timestamps # adds created_at and updated_at fields

  field :condition, :type => String
end

自動的にMongoidのtimestampモジュールを使うようになってます。便利ですねー

stomachモデルを管理画面に追加

% padrino gen admin_page stomach

これがPadrinoの便利なところ!(だと思っている)
上記コマンドを叩くだけで管理画面にタブが追加され、先ほど作成したstomachモデルのデータを管理画面から一覧/作成/編集できるようになります。
f:id:marutanm:20110415234112p:image
Stomachesタブからデータを一覧できるし
f:id:marutanm:20110415234114p:image
新規作成もできる。ここまでコード書いてないのに!

Controller作成

% padrino gen controller condition

stomachの最新1件のconditionを表示するよう、生成されたapp/controllers/condition.rb を編集しましょう。

# app/controllers/condition.rb
MarutanmStomach.controllers :condition do
  get '/' do
      p Stomach.last.condition
  end
end

動作確認

http://localhost:3000/condition にアクセス。
stomachが空っぽだと内部エラーになるので、あらかじめ管理画面からなにか入れておきましょう。エラー処理が面倒なのではなく、空腹時は気持ち悪くなってしまうという胃の調子を模した挙動です!!!

デプロイ準備

rakefile作成
require File.dirname(__FILE__) + '/config/boot.rb'
require 'thor'
require 'padrino-core/cli/rake'

PadrinoTasks.init
db/seeds.rb
email     = "marutanm@gmail.com"
password  = "admin"

最初のほうのshell.askになってるあたりを変更。ファイルに直書きはどうかと思ったんだけど、管理画面から変更すればいいわけで。
このあたりは公式にあるチュートリアルのまま。

MongoHQ接続設定
# config/database.rb
#Mongoid.database = Mongo::Connection.new(host, port).db(database_name)
Mongoid.configure do |config|
  if ENV['MONGOHQ_URL']
    uri = URI.parse(ENV['MONGOHQ_URL'])
    conn = Mongo::Connection.from_uri(ENV['MONGOHQ_URL'])
    config.master = conn.db(uri.path.gsub(/^\//, ''))
  else
    config.master = Mongo::Connection.new(host, port).db(database_name)
  end
end

Herokuの環境変数を参照するようにする。

git-commit
% git init
% git add .
% git commit -m 'something comment'

herokuにはgit-pushを使ってデプロイしますからね。

Heroku側の準備
% heroku create marutanm_stomach
% heroku addons:add mongohq:free
% heroku rake seed

herokuコマンドはgemでインストールしてありますよね?
mongohqを入れるのを忘れずに、管理画面ログインできるようにもしないと。

デプロイ、動作確認

% git push heroku master
% heroku open

ブラウザから確認。Not Found表示になると思いますが、おもむろにURLにconditonを付加しましょう。
データが空っぽのときは例によってInternal Server Errorになるので、管理画面からデータを入れましょう。
f:id:marutanm:20110415234115p:image
ほら、胃の調子を表示してくれますね!
ロジックらしいロジックを記述することもなく、設定ファイルを少し書いたぐらいでできてしまいました。Padrinoのadmin-page機能すばらしいですね。高度に発達したSinatraはRailsと区別がつかなくなりそうです。そしてHerokuさまさまですよ、ホント。

関連、参考

Guides Blog Tutorial - Padrino Ruby Web Framework
Rails + Sinatra ≒ Padrino で遊ぼう! » 梨木を読む

  • -

20100419追記
はてブの関連エントリでみつけました。丁寧だし、こっちのほうが所要時間短いし。
Padrino+MongoDB+Herokuを使って、5分でWikiアプリ作成する « blog.udzura.jp