2010-06-01 7 views
17

Ngay bây giờ, tôi làm mộtNhận tuyệt đối (cơ sở) url trong Sinatra

get '/' do 
    set :base_url, "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}" 
    # ... 
    haml :index 
end 

để có thể sử dụng options.base_url trong index.haml HAML. Nhưng tôi chắc chắn rằng có một cách tốt hơn, DRY, cách làm điều này. Tuy nhiên, tôi không thể nhìn thấy, cũng không tìm thấy nó. (Tôi mới đến Sinatra :))

Bằng cách nào đó, bên ngoài nhận được, tôi không có request.env hoặc có vẻ như vậy. Vì vậy, đặt nó trong một bao gồm đã không làm việc.

Làm thế nào để bạn nhận được url cơ sở của mình?

+0

thế nào là 'options.base_url' không khô? – Adrian

Trả lời

24

Một vài điều.

  1. set là một phương pháp cấp lớp, có nghĩa là bạn đang thay đổi trạng thái toàn bộ ứng dụng với mỗi yêu cầu
  2. Trên đây là một vấn đề bởi vì có khả năng, các địa chỉ cơ sở có thể khác nhau trên các yêu cầu khác nhau ví dụ như http://foo.comhttps://foo.com hoặc nếu bạn đã nhiều tên miền chỉ vào máy chủ cùng một ứng dụng sử dụng DNS

một chiến thuật tốt hơn có thể để xác định một helper

helpers do 
    def base_url 
    @base_url ||= "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}" 
    end 
end 

Nếu bạn cần url cơ sở ngoài việc trả lời các truy vấn (không phải trong khối nhận/đăng/xóa/xóa), sẽ tốt hơn nếu bạn đặt địa chỉ đó theo cách thủ công ở đâu đó.

+0

Cảm ơn. Tôi đọc về những người giúp đỡ, nhưng không đủ xa để đi sâu vào đó. Cảm ơn. Có vẻ như câu trả lời là có :) – berkes

34

Bạn có thể lấy nó bằng cách sử request.base_url quá = D (hãy nhìn vào rack/request.rb)

+2

Điều này trông giống như cách tốt nhất, vì mã nguồn về cơ bản làm những gì mà câu trả lời khác gợi ý làm bằng tay và QUAN TRỌNG bao gồm cổng tùy chọn nếu nó không phải là mặc định – stujo