0

に基づいてRackアプリケーションを開発しましたSinatra::Base。ここで、1つのRackアプリケーションで、それぞれがわずかに異なる構成を持つ多くのインスタンスを使用したいと思います。

rackupは次のようになります

use Rack::Lint

map '/mel' do
    run Site.new('/home/mel/site').app
end

map '/pub' do
    run Site.new('/pub').app
end

このSiteクラスはさまざまなパラメーター(この例ではルートディレクトリのみ)を収集し、いくつかの準備作業を行います。このメソッドは、提供されたインスタンスへの参照を保持するオブジェクトを#app返す必要があります。ServerSite

これは、SiteandServerコードの例です。

class Site
    def initialize(root_dir)
        @root_dir = root_dir
        # ... set up things ...
    end

    def app
        # This is where a new Server Rack application should be created
        return Server.new { |server| server.set :site, self }
    end
end

class Server < Sinatra::Base
    before do
        @content = settings.site.all_files
    end

    get /(.*)/ do |url_path|
        # do things...
    end
end

このコードの問題は、#appメソッドが有効なRackアプリケーションを返さないことです。

構成済みの新しいRackアプリケーション#appを返却するにはどうすればよいですか?Server

4

1 に答える 1

1

これは、#sinatraの「carloslopes」によって提案されたように機能させる方法です。

Site#appメソッドは次のようになります

class Site
    def app
        # This is where a new Server object should be created
        return Server.new(self)
    end
end

オブジェクトはServerインスタンス変数を介してパラメータを取得します。

class Server < Sinatra::Base
    def initialize(site)
        super()
        @site = site
    end

    before do
        @content = @site.all_files
    end

    get /(.*)/ do |url_path|
        # do things...
    end
end

編集:他の人がソリューションをさらに改善し、クレジットを共有できるように、コミュニティwikiを作成しました。

于 2012-08-14T16:37:03.153 に答える