Ruby
Sinatra

【Sinatra】オートロード && オートリロードしてほしい

More than 1 year has passed since last update.

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

参考