http://qiita.com/izumin5210/items/cd2f9f48fbe1fdcaf628 の続編
sinatra-reloaderを使わなければもっと楽になる気がする…
導入
とりあえずsinatra-contrib
と`activesupport'を入れる.
Gemfile
# 前略
gem 'sinatra'
gem 'sinatra-contrib'
gem 'activesupport'
# 後略
ディレクトリ構成例
config/boot.rb
を用意し,最初にこれを読ませるようにする.
.
├── Gemfile
├── Gemfile.lock
├── config
│ ├── boot.rb
│ ├── database.yml
│ └── global
├── config.ru
├── lib
│ ├── app
│ ├── models
│ ├── ...
│
...
オートロードにActiveSupport::Dependencies
を利用するので,ファイル名とその中に定義されてるmodule/class名はその規約に従わないといけない.
e.g.
-
./lib/models/user.rb
=>User
-
./lib/models/app/user.rb
=>App::User
有効化
Classic Application
オートロード
ActiveSupport::Dependencies.autoload_paths
に対象ディレクトリ(ここでは./lib
以下の各ディレクトリ)を喰わせる.
config/boot.rb
ROOT_DIR = File.join(File.expand_path(File.dirname(__FILE__)), '..')
SOURCES_DIR = File.join(ROOT_DIR, 'lib')
ActiveSupport::Dependencies.autoload_paths = Dir[File.join(SOURCES_DIR, '**')]
オートリロード
どこかでsinatra/reloader
を有効化する.その後,オートリロードしたいファイル(ここでは./lib
以下の各*.rb
ファイル)をalso_reload
に喰わせる.
lib/app/app.rb
require 'sinatra'
if development?
require 'sinatra/reloader'
Dir[File.join(SOURCES_DIR, '**', '*.rb')].each { |f| also_reload f }
end
Modular Application
オートロード
Classicのときと同じ.
オートリロード
だいたい似たような感じ.
app.rb
require 'sinatra/reloader' if development?
class App < Sinatra::Base
configure :development do
register Sinatra::Reloader
Dir[File.join(SOURCES_DIR, '**', '*.rb')].each { |f| also_reload f }
end
# snip.
end