私の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