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

  • 0
    いいね
  • 0
    コメント

    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
    

    参考