2012-01-18 3 views
5

私はconfig.ruのラック初期化コード内から自分のWebアプリケーションのベースURLを取得したいと考えています。RackサービスのベースURLをリクエストハンドラの外に出すことはできますか?

puts "Starting up on http://#{ENV['SERVER_NAME']}:#{ENV['SERVER_PORT']}/#{ENV['MOUNT_POINT']}..." 

しかし、私はリクエストハンドラの外部から利用可能なこのようなものは見つかりませんでした。明らかに、私は次のようなことをすることができます:

... 
def get 
    puts "Got a request for #{ENV['rack.url_scheme']}://#{ENV['HTTP_HOST']}#{ENV['REQUEST_PATH']}" 
    ... 

リクエストはその時点で定義されているためです。しかし、私の設定ファイルの始めには、それらの変数のどれも定義されていないようです。

この情報へのアクセスに使用できるラック方式はありますか?これは、ラックの起動が完了するまでこれらの事柄がファイナライズされないケースの1つですか?私は、環境が "準備完了"になったらそれを実行するメソッドにprocを渡す方法を持つ他のフレームワークを覚えているようです。ラックにはそういうものがありますか?

+0

この情報が必要なconfig.ruに何を設定しようとしていますか? – nictrix

+0

私は*何も設定しようとしていません。サービスがどこにあるかをログに表示するといいと思います。新しいデベロッパーが初めてテストを試みるときに特に便利です。 – Coderer

答えて

2

私は、Rackアプリケーションが「マウントポイント」を事前に知ることはできないと考えています。例えば、このconfig.ruが複数で同じアプリケーションがマウントポイントをマウント:

require 'rack' 

app = proc { |env| 
    [200, {'Content-Type' => 'text/plain'}, ['hello, world!']] 
} 

run Rack::URLMap.new('/myapp' => app, 
        '/' => app) 

ラックは、初期化時に呼び出されている任意の標準的な方法を提供しません。私はこれがRackが単純CGIをサポートしようとしているからだと思う。そこでは、Rubyプロセス全体が各リクエストを処理するために作成され、各リクエストでプロセスが終了する。そのような状況では、 "init"メソッドの使用はあまりありません。

2

約1年後ですが、私は同じ問題で苦労していて、あなたのスレッドを見つけました。

すべてのRackアプリケーションは、Rackハンドラによって呼び出されるcall-methodを提供します。たとえば、Sinatra :: Base#callのコードを参照してください。この呼び出しメソッドは、リクエストごとに1回呼び出され、環境変数を含むハッシュの1つのパラメータを持ちます。これらの中には必要なものがすべてあり、あなたが求めていた "mount_point"は "SCRIPT_NAME"と呼ばれています。

詳細はhttp://www.rubydoc.info/github/rack/rack/file/SPECを参照してください。残念ながら、この情報はリクエスト中にのみ利用でき、私が知る限りでは利用できません。他の人に役立つことを願っています

関連する問題