高木のブログ

【Sinatra】Rack::URLMap を使ってコントローラーを分割する

2022/06/14

app.rb がだんだんファットになってきて、コントローラーを分割したくなった
コントローラーを分割するやり方はいくつかあって、Rack::URLMap を使う方法を試したのでメモ

app.rb
require 'sinatra/base'

class RootController < Sinatra::Base
  get '/' do
    "RootController"
  end
end

class UsersController < Sinatra::Base
  get '/' do
    "UsersController"
  end
end

class TasksController < Sinatra::Base
  get '/' do
    "TacksController"
  end
end

app.rb にまとめて書いたけど、本来は別ファイルに書く(controllers ディレクトリを作って)

config.ru
require './app'

run Rack::URLMap.new({
  '/' => RootController,
  '/users' => UsersController,
  '/tasks' => TasksController
})
$ bundle exec rackup
Puma starting in single mode...
* Puma version: 5.6.4 (ruby 3.1.2-p20) ("Birdie's Version")
*  Min threads: 0
*  Max threads: 5
*  Environment: development
*          PID: 29609
* Listening on http://127.0.0.1:9292
* Listening on http://[::1]:9292
Use Ctrl-C to stop
$ curl localhost:9292
RootController

$ curl localhost:9292/users
UsersController

$ curl localhost:9292/tasks
TacksController

サクッとできた
ただ /users/:user_id/tasks みたいな名前付きパラメータが含まれるルーティングはうまくいかなかった

参考


ytkg

Written by ytkg, Twitter, GitHub