0

私のrubyアプリケーションの1つでは、サブドメインに基づいてリクエストをルーティングするサーバーが必要です。他の宝石を使用してこれを行う方法はありますが、私は自分の「ミドルウェア」を作成することにしました。このコードは、リクエストの送信先に基づいてアプリケーションを実行します。

config.ru

require './subdomain'
require './www'

run Rack::Subdomain.new([
  {
    :subdomain => "test", 
    :application => Sinatra::Application
  }
]);

subdomain.rb

module Rack
  class Subdomain
    def initialize(app)
      @app = app
    end

    def call(env)
      @app.each do |app|
        match = 'test'.match(app[:subdomain])
        if match
          return app[:application].call(env)
        end
      end
    end
  end
end

私の質問は、この動作するコードをまったく同じように動作するように変更する方法ですが、次のようなコードで呼び出すことができます:

run Rack::Subdomain do
  map 'www' do
    Example::WWW
  end

  map 'api' do
    Example::API
  end
end

提案されたコードで:

config.ru

require './subdomain'
require './www'

run Rack::Subdomain.new do |x|
  x.map 'test' do
    Sinatra::Application
  end
end

subdomain.rb

module Rack
  class Subdomain
    def initialize(routes = nil)
      @routes = routes
      yield self
    end

    def map(subdomain)
      @routes << { subdomain: subdomain, application: yield }
    end

    def call(env)
      @routes.each do |route|
        match = 'test'.match(route[:subdomain])
        if match
          return route[:application].call(env)
        end
      end
    end
  end
end
4

1 に答える 1

-1

上記を「作業コード」と呼びますが、サブドメインをまったく検出していないようですが、文字通りの「テスト」に接続します。いずれにせよ、サブドメイン->アプリケーションルートのリストにエントリを追加するmapメソッドを作成することで、必要なパターンと同様のパターンを実装できます。これはルートのハッシュであり、アプリケーション参照ではないため、名前をに変更@appしました。@routes

module Rack
  class Subdomain
    def initialize(routes = [])
      @routes = routes
      yield self if block_given?
    end

    def map(subdomain)
      @routes << { subdomain: subdomain, application: yield }
    end

    def call(env)
      @routes.each do |route|
        match = 'test'.match(route[:subdomain])
        if match
          return route[:application].call(env)
        end
      end
    end
  end
end

rsd = Rack::Subdomain.new do |x|
  x.map 'www' do
    Example::WWW
  end

  x.map 'api' do
    Example::API
  end
end

run rsd
于 2013-03-10T19:20:29.667 に答える