Posted at

SinatraのModular Applicationで機能分割

More than 5 years have passed since last update.

男は黙ってClassic Styleで1ファイルと言いたいところだがさすがに行数が増えてくるとメンテンナンスし辛いのでファイルをゆるーく分割する。

Modular Applicationの場合は


config.ru

require './my_app'

run MyApp

のようにしてSinatra::Baseの継承クラスをrunで渡して実行できるが、mapと組み合わせることで、URLのマッピングにあわせて切り替えることができる。


config.ru

require './app'

require './hello'

map('/') { run App }
map('/hello') { run Hello }



app.rb

require 'bundler'

Bundler.require

class App < Sinatra::Base
configure :development do
Bundler.require :development
register Sinatra::Reloader
end

get '/' do
'welcome'
end

not_found do
'not_found'
end

error do
'error'
end
end



hello.rb

class Hello < App

get '/:name' do
"Hello #{params[:name]}!"
end
end

こんな風にすると/hello/taroというリクエストはhello.rbで処理できる。MVCでいうとControllerを作っているだけなのだがMVCやりだすとSinatra以外のフレームワークを使った方がいいんじゃないかと疑心暗鬼になるのでゆるい機能分割程度に留める。