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

Studio3104::BLOG.new

uninitialized constant Studio3104 (NameError)

Sinatra で Controller を分割したくなったら Rack::URLMap を使うとよさそう

こういう感じのアプリケーションがあったとします。

で、この例だとまったくファットじゃないんだけど、Controller がファットになってきてしまった場合に、いい感じに分割したくなることもありますよね。
ということでとりあえずこうしてみた。

各クラスが Sinatra::Base を継承するではなくて、Base を設けてそれを継承するようにしているのは、各クラス内でそれぞれ before を書きたくなかったからです。
が、このように書いてしまうと、リクエストパスによっては 1 回のリクエスト中に before 内の処理が複数回実行されてしまいます。(実際に before に適当に p 123 とか書いて起動して、アクセスしてみるとわかる)

それだと最悪なので、最終的にこうした。

ルーティングを config.ru に書きたくなかったので、定数化して呼び出すようにしています。

参考

Sinatra Pattern 20130415