2012-01-18 15 views
5

Web uygulamamın temel URL'sini, config.ru numaralı telefonumdaki Rack başlatma kodu içinden alabilmek istiyorum. Bir şey satırları:Raf hizmetimin temel URL'sini istek işleyicisi dışında alabilir miyim?

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

ama bir istek işleyicisi dışından kullanılabilir böyle bir şey bulamadı. Açıkçası, isteğin o noktada tanımlandığı gibi:

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

. Ancak, yapılandırma dosyamın başlangıcında, bu değişkenlerin hiçbiri tanımlanmamış gibi görünüyor.

Bu bilgilere erişmek için kullanabileceğim bir Raf yöntemi var mı? Rack başlangıcı bitinceye kadar bu şeylerin tamamlanmadığı vakalardan biri mi? Çevre "hazır" olduktan sonra onu yürütecek bir yönteme bir proks geçme yolu olan diğer çerçeveleri hatırlıyorum. Rafta böyle bir şey var mı?

+0

Bu bilgiye gereksinim duyan config.ru'da ne ayarlamaya çalışıyorsunuz? – nictrix

+0

Ben * bir şey ayarlamak için çalışmıyorum, sadece servisin nerede olduğunu göstermek için günlüğü güzel olduğunu düşünüyorum - özellikle yeni bir dev ilk kez denemeye çalıştığında yararlıdır. – Coderer

cevap

2

Raf uygulamasının "bağlama noktası" nı önceden bilmesinin mümkün olduğuna inanmıyorum. Örneğin, bu config.ru birden aynı uygulama bağlama noktaları bağlar:

require 'rack' 

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

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

Raf Ayrıca, başlatma sırasında çağrılır herhangi bir standart yöntem sağlamaz. Şüpheliyim ki, Rack her bir talebe cevap vermek için bütün bir Ruby sürecinin oluşturulabildiği düz CGI'yı desteklemeye çalışmaktadır çünkü süreç her bir süreçten çıkmaktadır. Bu durumda, bir "init" yöntemi için fazla bir şey yoktur.

2

Yaklaşık bir yıl sonra ama aynı sorunla uğraşıyordum ve iş parçanızı buldum.

Her Raf uygulaması, Raf işleyicisi tarafından çağrılan bir çağrı yöntemi sağlar. Örneğin Sinatra :: Base # call koduna bakınız. Bu çağrı yöntemi, istek başına bir kez çağrılır ve ortam değişkenlerini içeren bir karma olan bir parametreye sahiptir. Bunların içinde ihtiyacınız olan her şey var ve sorduğunuz "mount_point" "SCRIPT_NAME" olarak adlandırılıyor. Ayrıntılar için http://www.rubydoc.info/github/rack/rack/file/SPEC adresine bakın. Ne yazık ki, bu bilgi sadece bir istek sırasında ve bildiğim kadarıyla değil. Umarım başkalarına yardım eder.