Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get absolute (base) url in sinatra

Tags:

ruby

sinatra

haml

Right now, I do a

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

to be able to use options.base_url in the HAML index.haml. But I am sure there is a far better, DRY, way of doing this. Yet I cannot see, nor find it. (I am new to Sinatra :))

Somehow, outside of get, I don't have request.env available, or so it seems. So putting it in an include did not work.

How do you get your base url?

like image 959
berkes Avatar asked Jun 01 '10 13:06

berkes


2 Answers

You can get it using request.base_url too =D (take a look at rack/request.rb)

like image 178
epidemian Avatar answered Nov 12 '22 22:11

epidemian


A couple things.

  1. set is a class level method, which means you are modifying the whole app's state with each request
  2. The above is a problem because potentially, the base url could be different on different requests eg http://foo.com and https://foo.com or if you have multiple domains pointed at the same app server using DNS

A better tactic might be to define a helper

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

If you need the base url outside of responding to queries(not in a get/post/put/delete block or a view), it would be better to set it manually somewhere.

like image 34
BaroqueBobcat Avatar answered Nov 13 '22 00:11

BaroqueBobcat