データベースは、MySQL、SQLiteなど選択に困るほど存在しますが、ここでは ドキュメント指向データベースのMongoDBを使用します。
インストールは公式ページにしたがっておこないます。
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
/etc/apt/sources.list
deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen
$ sudo update $ sudo apt-get install mongodb-10gen次にsinatraで扱えるようにします。
. ├── config │ ├── mongoid.yml # 追加 │ └── unicorn.rb ├── config.ru ├── Gemfile ├── Gemfile.lock ├── Guardfile ├── lib │ ├── app.rb │ └── models.rb # 追加 ├── public ├── spec │ ├── app_spec.rb │ └── spec_helper.rb └── views ├── index.slim ├── layout.slim └── style.scss
source :rubygems gem 'sinatra', require: 'sinatra/base' gem 'slim' gem 'sass' gem 'unicorn' gem 'mongoid' gem 'bson_ext' group :development do gem 'sinatra-reloader', require: 'sinatra/reloader' end group :test do gem 'rspec' gem 'rack-test', require: 'rack/test' gem 'guard-rspec' end
$ bundle install
config/mongoid.yml
development: host: localhost database: mydb動かすだけであれば、設定はこの程度でも動作します。
公式により詳細な設定が書かれています。
lib/models.rb
class Game include Mongoid::Document field :title, type: String field :platform, type: String end
lib/app.rb
require 'models' class MyApp < Sinatra::Base configure :development do Bundler.require :development register Sinatra::Reloader Slim::Engine.set_default_options pretty: true Mongoid.logger = Logger.new(STDOUT) Mongoid.logger.level = Logger::INFO end configure do set :root, File.expand_path('../../', __FILE__) Mongoid.load! File.join(settings.root, 'config', 'mongoid.yml') end get '/' do slim :index end get '/games/:field' do content_type :text game = Game.first game ? "#{game.__send__ params[:field]}" : "nil" end get '/css/:file.css' do scss params[:file].to_sym end endMongoid.load! File.join(settings.root, 'config', 'mongoid.yml')
で設定を読み込みます。
このまま使用するとRSpecを使用した時もクエリの内容等、デバッグログが出力されてしまうので抑制します。
Mongoid.logger = Logger.new(STDOUT)
Mongoid.logger.level = Logger::INFO
用途に合わせて出力先や出力レベルを調整するとよいでしょう。
注意しなければならないのはMongoid.load!よりも前に定義しなくてはいけないことです。Mongo Ruby Driverが公開APIを提供していないため、masterの設定より先に記述しなくてはいけないようです。ソースを除くとrailsでは別途railsで指定したloggerを参照しているようです。
models.rbでサンプルとなるモデルを定義しています。このあたりsinatraは自由なのでapp.rbに定義してもよいし、モデルごとにファイルを分割しても問題ありません。使える型についても公式に記述があります。
ルートも増えたところで対応するテストケースも追加しておきましょう。
spec/spec_helper.rb
require 'bundler/setup' Bundler.require :default, :test require 'app' require 'models' RSpec.configure do |config| config.include Rack::Test::Methods end
spec/app_spec.rb
require 'spec_helper' describe MyApp do def app @app ||= MyApp end context "when get '/'" do before do get '/' end subject { last_response } its(:status) { should == 200 } its(:body) { should include("Hello World!") } end describe "MongoDB access" do before do Game.destroy_all if Game.exists? Game.create(title: "GOD EATER BURST", platform: "PSP") end context "when get '/games/title'" do before { get 'games/title' } subject { last_response } its(:body) { should == "GOD EATER BURST" } end context "when get '/games/platform'" do before { get 'games/platform' } subject { last_response } its(:body) { should == "PSP" } end end end
0 件のコメント:
コメントを投稿