大貓共和國

Meow

Rails3, Mongoid, Devise, Heroku, MongoHQ筆記

最近在看一些NoSQL的東西,於是想以MongoDB進行一些實作的練習。這篇文章是我在練習過程中,環境設定的筆記。

Installing Rails 3

請看我的上一篇文章

Installing MongoDB

我的開發環境是Ubuntu和Windows(在家用Ubuntu、出外用Windows,所以試了兩個環境)。Linux的話,個人建議不要用package system(apt/yum)的MongoDB。首先,絕對不要apt-get install mongodb。我一開始練習MongoDB時,是用apt-get裝的,會抓到一個舊到爆炸(1.4.4)的stable版本,這個版本mongo console client打錯指令還會crash(這是stable版嗎?)。

如果一定要用package的話可以考慮apt-get install mongodb-unstable或apt-get install mongodb-snapshot。但我是直接去官網抓build好的版本,再sudo copy到/usr/bin就好了。

MongoDB Object Mapper: Mongoid

Mongo的Ruby Object Mapper有很多種,可以參考官網上的列表。我選用Mongoid的原因有二:

  • Mongoid的官網做的還滿有模有樣的,看樣子應該有認真維護 XD
  • Devise認證機制內建支援Mongoid

安裝照著官方installation文件做就好了:

  gem i mongoid –pre
  gem i bson_ext

如果是Windows系統的話,mongo gem需要build一些native code,所以推薦裝RubyDevKit,裝完就可以順利的安裝mongo相關gems。

Mongoid使用上非常的簡單,Mongoid蓋掉了ActiveRecord的generators。要快速建出一個能動的環境,在設定好gems後只需要:

  rails g mongoid:config
  rails g scaffold article title:string content:string

只要mongod開著,這樣就可以動了,不用做data migration。唯一會踩到的雷可能是用了舊版的mongodb,所以就如前面提到的,請不要apt-get install。

Authentication: Devise

Devise是一套不錯的rails認證機制,而且內建對Mongoid的支援 一樣照著官方文件做就能動,整合非常簡單。安裝:

  gem i devise

整合進app:

  rails generate devise:install
  rails generate devise User

接下來只要在view裡把link接一接就好。如果原本就用過devise,基本上用ActiveRecord或Mongoid沒啥差別。要速查link path helpers的話可以用rake routes。

唯一要注意的地方是要記得自己打index,我原本以為Model中的

  devise :database_authenticatable, :registerable #……

這行,會自動在Mongoid Model上加上index。但rake db:mobgoid:create_indexes後,User collection上還是沒有任何index,所以要自己在Model上加:

  index :email, :unique => true

然後再執行一次rake db:mongoid:create_indexes,把index打上去。

另外,有人做了Rails3+Mongoid+Devise的整合包。但Devise和Mongoid的整合實在太簡單了,不彷自己做一遍,也比較容易了解細節。

Deployment Environment: Heroku & MongoHQ

Heroku是一個雲端的Rails Hosting Platform,其使用方式應該很多文章介紹過了,這裡就不多廢話。基本上注冊好heroku帳號後,在rails app路徑下:

  heroku create appname
  git push heroku master

就可以把app deploy上去。

MongoHQ是一個雲端的MongoDB Hosting服務,提供了免費(16MB Limit)及付費的MongoDB空間。由於Heroku與MongoHQ有合作,並將MongoHQ做成了Heroku的一個addon,所以整合特別簡單。這裡是官方文件,只要下一行指令:

  heroku addons:add mongohq:free

heroku就會自動向MongoHQ註冊一個資料庫,並設定rails的環境變數。注意官方文件有個地方沒講的很清楚,在config/mongoid.yml中,多加上mongohq的設定:

  production: 
    uri: <%= ENV['MONGOHQ_URL'] %>

設定好後,MongoID就可以吃到MongoHQ的環境變數,並正確地建立資料庫連線。

順便列一下Heroku合作的資料庫中,免費方案的比較:

  • Heroku內建Database: 5MB (Postgre SQL)
  • Redis To Go: 5MB (Redis)
  • MongoHQ: 16MB (MongoDB)
  • Cloudant: 100MB, 500k requrest per month (CouchDB)

開發筆記待續…

Comments