2012-01-18 5 views
5

Tôi muốn có thể truy xuất URL cơ sở của ứng dụng web của tôi từ trong mã khởi tạo Rack trong số config.ru của tôi. Nội dung nào đó dọc theo dòng:Tôi có thể lấy URL cơ sở của dịch vụ Giá của mình bên ngoài trình xử lý yêu cầu không?

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

nhưng tôi chưa tìm thấy bất kỳ thứ gì như thế này có sẵn từ bên ngoài trình xử lý yêu cầu. Rõ ràng, tôi có thể làm điều gì đó như:

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

vì yêu cầu được xác định tại thời điểm đó. Nhưng khi bắt đầu tập tin cấu hình của tôi, không có biến nào trong số đó xuất hiện để xác định.

Có phương pháp Rack nào tôi có thể sử dụng để truy cập thông tin này không? Đây có phải là một trong những trường hợp mà những điều đó không được hoàn thành cho đến khi Rack startup được hoàn thành? Tôi dường như nhớ các khung công tác khác có cách để chuyển một proc tới một phương thức sẽ thực thi nó khi môi trường đã "sẵn sàng". Rack có bất cứ thứ gì như thế không?

+0

Bạn đang cố gắng đặt gì trong config.ru cần thông tin này? – nictrix

+0

Tôi không cố gắng * đặt * bất cứ điều gì, tôi chỉ nghĩ rằng nó là tốt đẹp cho các bản ghi để hiển thị nơi dịch vụ là - nó đặc biệt hữu ích khi một dev mới cố gắng thử nghiệm cho lần đầu tiên. – Coderer

Trả lời

2

Tôi không tin rằng ứng dụng Rack có thể biết trước thời điểm "điểm gắn kết". Ví dụ, config.ru này gắn kết ứng dụng cùng một lúc nhiều điểm lắp:

require 'rack' 

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

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

Tủ này cũng không cung cấp bất kỳ phương pháp tiêu chuẩn đó được gọi là lúc khởi tạo. Tôi nghi ngờ điều này là bởi vì Rack cố gắng hỗ trợ đồng bằng CGI, nơi mà toàn bộ quá trình Ruby có thể được tạo ra để xử lý từng yêu cầu, với quá trình thoát ra ở mỗi yêu cầu. Trong tình huống đó, không có nhiều sử dụng cho một phương pháp "init".

2

Đó là khoảng một năm sau đó nhưng tôi đã chỉ đấu tranh với cùng một vấn đề và tìm thấy chủ đề của bạn.

Mỗi ứng dụng Rack cung cấp một phương thức gọi được gọi bởi trình xử lý Rack. Ví dụ, xem mã của Sinatra :: Base # call. Phương thức gọi này được gọi một lần cho mỗi yêu cầu và có một tham số là một băm có chứa các biến môi trường. Trong đó có mọi thứ bạn cần và "mount_point" mà bạn đang yêu cầu được gọi là "SCRIPT_NAME".

Xem http://www.rubydoc.info/github/rack/rack/file/SPEC để biết chi tiết. Rất tiếc, thông tin này chỉ có sẵn cho bạn trong một yêu cầu chứ không phải trước khi tôi biết. Hy vọng nó sẽ giúp người khác.