HerokuとRails3とMongoDB

Heroku上のRailsからMongoDBの中身を参照できるあたりまで試してみました。忘れないうちにメモしておきます。今回やってみてわかったことは下記。

  1. 今はrails 3.0.0.rcだとそのままデプロイできない
  2. MongoDBを使うにはアドオンを使う(クレジットカードが必要)
  3. Heroku上で動くRubyのバージョンはいくつかあるうちから選べる
  4. herokuコマンドってべんり

Herokuのプロジェクトを作ってPush

ここのステップ通りにやれば、おおむねうまく行きました。herokuコマンドは、

% gem install heroku

で入れます。
ここは特筆すべきことが無い筈なんですが、環境がRails 3.0.0.rcだと、今現在はbundlerのバージョンが違うと怒られてHerokuにうまくデプロイできなかった。http://blog.mhartl.com/2010/07/28/deploying-to-heroku-with-rails-3-0-0-rc/を参考にbundlerのバージョンを落としたりGemfileをちょっと編集したり。これでHerokuにPushできた。

bundlerのバージョンを落とす
% [sudo] gem uninstall bundler
% [sudo] gem install bundler -v 0.9.26
Gemfileをちょっと編集
source 'http://rubygems.org'

#gem 'rails', '3.0.0.rc' # コメントアウト
gem 'rails', '3.0.0.beta4' # バージョンを変える
bundle installし直し
% rm -f Gemfile.lock
% bundle install
% bundle lock

プロジェクトにアドオン「MongoHQ」を追加*1

MongoDBを使うにはプロジェクトにMongoHQというアドオンを追加します。アドオンの追加をするには無料版でもクレカの登録が必要(登録は初回だけ)。
Compose MongoDB - Add-ons - Heroku Elements
登録していないと「You must be verified to add MongoHQ Free」だったかそんな感じのことを言われます。
肝心のアドオンの追加自体は、WebからやってもTerminalのherokuコマンドでやってもいいみたいです。herokuコマンドで追加する場合は↓みたいな感じです。

% heroku addons:add mongohq:free

ローカルの開発環境からMongoHQにつないでみたりする場合、heroku console で繋いだら ENV['MONGOHQ_URL'] にDSNが入ってます。

% heroku console
>> ENV['MONGOHQ_URL']  # 使ってるMongoHQのURLが入ってる
=> "mongodb://username:password@server:port/dbname"
>> exit
% export MONGOHQ_URL='mongodb://username:password@server:port/dbname' 
% rails c  # とかでローカルからもMongoHQを見にいけたよ

DBに接続するためにGemfileとか色々編集

mongo_mapperを使うので下記をGemfileに記述。

gem 'mongo_mapper'

bundle installとかいろいろする。

% rm -f Gemfile.lock
% bundle install
% bundle lock

config/initializers/mongo.rb とか作って接続の部分を記述(これでいいのか?)。

require 'mongo_mapper'

MongoMapper.config = { 
  'development'=>{'uri'=>ENV['MONGOHQ_URL']},
  'test'=>{'uri'=>ENV['MONGOHQ_URL']},
  'production'=>{'uri'=>ENV['MONGOHQ_URL']}
}

MongoMapper.connect RAILS_ENV

ひとまずこれで繋がるようになりました。modelとか作るのはMongoMapper, The Rad Mongo Wrapper // RailsTips by John Nunemakerを参考に。

Heroku上で動くRubyのバージョンを指定

色々触っているとHeroku上で動いているRubyのバージョンが1.8.7なことに気づきます。
デフォルトだと1.8.7が動いてるみたいです。1.9.1などに変更したい場合は、http://docs.heroku.com/bambooを参考に変更します*2。具体的には、

% heroku stack:migrate bamboo-mri-1.9.1

などとすればOK。*3

*1:これが最初はイマイチ使い方がわからなくて、MongoHQのサイトに行って一からアカウントを作ってみたりしていたんですが、よく調べてみると操作はHerokuの中だけで完結できるようです。

*2:heroku createするときにも--stackで指定できる

*3:1.9.1の場合は次のPushで反映されるみたいです