読者です 読者をやめる 読者になる 読者になる

プログラミング 美徳の不幸

Ruby, Rails, JavaScriptなどのプログラミングまとめ、解説、備忘録。

Sinatra入門

最近自分つくづくRailsの話しかできない人だなと思ったので、Sinatraを触ってみました。いや、ホントは実務で必要になっただけなのですが。

てかそれでもやっぱWebアプリケーションフレームワークRubyかよ、という。。。やっぱC++でゲーム作りとかやってみたいですね、思い切って。

まず触ってみて、比較をしましょう。

Rails
利点
・全部盛り
・痒い所に手がとどく
・ググれば資料たくさん
デメリット
・でかすぎるので軽量なのに向かない
・お約束を覚えないといけない

Sinatra
利点
・軽量
・放任しすぎず自由にカスタマイズしやすいという絶妙な裁量が与えられる
デメリット
cookieとか使おうと思うと検索しても資料出てこない
・資料が間違ってる、というかいけてないコード多い(私見)
・さくっとやるとはいえ結局Bundlerとかでライブラリ管理したいので、そこらへんの初期セットアップが少し必要。


まぁこんなところかな。初期セットアップというのはrequireを各ファイルに散らばらせるのはよくないので、それを集約させるコードの書き方があるのですが、なかなか綺麗にそれをやっているサンプルがないですね。

というわけで、それをやりましょう。

◯Gemfile

source :rubygems
gem 'sinatra'
gem 'sequel'
gem 'haml'
...

まずはGemfileはこのように用意します。Railsと全く同じですが、SinatraはデフォルトでBundlerを使っているわけではないので自分で作成します。

◯app.rb

require 'rubygems'
require 'sinatra'
require 'bundler'
Bundler.require

Dir["./models/*.rb"].each{|f| require f}

get '/' do
...

app.rbでもweb.rbでもなんでもいいんですが、Sinatraのエントリポイントとなるファイルはこのように書きます。bundlerをここでrequireして、先頭でBundler.requireをやるとGemfileに書いてあるライブラリがすべてrequireされます。

◯ Sequelとは
SequelはActiveRecordと同じようなORMです。ActiveRecordを使おうと思ったんですがSinatraはSequelを使っているサンプルが多かったので、こちらを利用しました。
Railsと同じようにmodelとして利用する場合は
◯models/user.rb

Sequel.connect("sqlite://db/development.sqlite3")
class User < Sequel::Model
end

このようにやるわけですが、モデル宣言時にはSequelを読み込んでおく必要があります。しかもapp.rbからUser.where...のようなコードを発行する場合は、Railsと違ってファイルがロードされているわけではないので自分でrequireしてやらないといけません。
だからここでmodelをrequire剃る前にsequelをrequireする、そのためにBundler.requireを先に書かないといけないんですね。

ちなみにSinatraをherokuで動かす場合はconfig.ruとProcfile、あとはSequel用のmigrationとmigrateタスクのRakefileを用意すればいいのですが、これはけっこう落ちてるサンプルの通りにやればうまくいきます。