Hello, Sinatra! (1)
いまさらSinatraを始めてみた。
モチベ
- 個人で新しい何かを作り始めた。個人でやるからには、仕事じゃ使えないけど気になってる技術を使った方がいいので、RailsじゃなくてSinatraを使ってみることにした。
- Railsやってると、あんまりRackとか下のレイヤーを意識しないので、そこらへんに前から興味があった。
- Sinatraがダメだったら、Padrinoやるかも。
versions
- 2012年10月7日時点で最新のもの
sinatra install
# Gemfile source :rubygems gem 'sinatra'
$ bundle install --path vendor/bundle --binstubs
- とりあえずRailsのときと同様に
vendor/bundle
以下に入れる。
# app.rb require 'bundler' Bundler.require get '/' do 'Hello, Sinatra!' end
$ ruby -rubygems app.rb
- http://localhost:4567 で起動を確認。
- スモールスタートがいい。
rabl
# Gemfile source :rubygems gem 'sinatra' gem 'rabl'
$ bundle
- JSONのレスポンスをテンプレートで記述したかったので
rabl
をインストール
# app.rb require 'bundler' Bundler.require Rabl.register! get '/' do render :rabl, :home, :format => :json end
# views/home.rabl node(:greeting) do 'Hello, Sinatra with rabl!' end
- 最近、rabl開発メンバーがsinatraに公式サポートのpull requestを送って、sinatraでrablが公式にサポートされるようになったっぽい。
- そのせいか、公式ドキュメント通りではうまくいかず結構時間かかった。
config.ru
# config.ru require 'bundler' Bundler.require require './app' run App
# app.rb require 'sinatra/base' class App < Sinatra::Base Rabl.register! get '/' do render :rabl, :home, :format => :json end end
- Herokuやpowで起動する際config.ruが必要っぽい。
run [app name]
は必須。これがないと動かない。
pow
# Gemfile group :development do gem 'powder' gem 'guard-pow' end
$ bundle $ powder link $ guard pow init
- sinatraでは、ファイルを変更するたびにサーバーを再起動する必要があってめんどくさい。
- そこで、guard-powを使うことでその作業を自動化する。
- Guardfileはこんな感じにしてみた。
# Guardfile guard 'pow' do watch('Gemfile') watch('Gemfile.lock') watch('app.rb') watch('config.ru') end
heroku & thin
# Gemfile group :production do gem 'thin' end group :development do gem 'heroku' gem 'powder' end
# Procfile web: thin start -p $PORT -e $RACK_ENV
- herokuはすんなりデプロイできた。
- developmentはpowサーバを使うのでproductionのみthinをインストール。
- Procfileにwebを書いておくと、Herokuのデフォルトのアプリケーションサーバを変更できる。デフォルトはWEBRickなのでthinに変える。thinの方がパフォーマンスがいいらしい。
activerecord
# Gemfile gem 'sinatra-activerecord' gem 'rake' group :production do gem 'pg' end group :development, :test do gem 'sqlite3' end
$ bundle
- sinatraで使えるactiverecordと各環境用のアダプターをインストール。
# Rakefile require 'bundler' Bundler.require require 'sinatra/activerecord/rake' require './app' require './config/environment'
$ rake -T
rake db:create_migration
rake db:migrate
rake db:rollback
# config/environment.rb require 'uri' configure :development do set :database, 'sqlite:///db/development.db' end configure :test do set :database, 'sqlite:///db/test.db' end configure :production do db = URI.parse(ENV['DATABASE_URL'] || 'postgres://localhost/mydb') ActiveRecord::Base.establish_connection( :adapter => db.scheme == 'postgres' ? 'postgresql' : db.scheme, :host => db.host, :port => db.port, :username => db.user, :password => db.password, :databasee => db.path[1..-1], :encoding => 'utf8' ) end
- githubのREADMEにしたがってRakefileで必要なものを
require
すると、マイグレーションができるようになる。 - sqliteのパスは
///
とスラッシュ3つなのが注意。 - heroku用の設定はherokuのdevcenter(ここ)で紹介されたものをコピペした。
$ rake db:create_migration $ rake db:migrate
- ちなみにテストなど環境を指定する場合は
RAILS_ENV
の代わりにRACK_ENV
を使う。
$ rake db:migrate RACK_ENV=test
$ git push heroku master $ heroku run rake db:migrate Running `rake --trace db:migrate RACK_ENV=production` attached to terminal... up, run.1 ** Invoke db:migrate (first_time) ** Execute db:migrate rake aborted! could not connect to server: Connection refused Is the server running on host "localhost" and accepting TCP/IP connections on port 5432?
- DBに接続できない。。。
連休やったのはここまで。 時間があれば(2)もやる予定。