在sinatra获得绝对(基础)网址

ber*_*kes 18 ruby haml sinatra

现在,我做了

get '/' do
  set :base_url, "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
  # ...
  haml :index
end
Run Code Online (Sandbox Code Playgroud)

能够在HAML index.haml中使用options.base_url.但我确信有更好的,干的,这样做的方式.然而,我看不到,也找不到它.(我是Sinatra的新手:))

不知何故,在get之外,我没有request.env可用,或者看起来如此.因此将它放入包含中并不起作用.

你如何得到你的基本网址?

epi*_*ian 37

您也可以使用request.base_url= D(看看rack/request.rb)

  • 这看起来是最好的方式,因为源代码基本上做了另一个答案建议手动执行的操作,并且重要包括端口可选,如果它是非默认的 (2认同)

Bar*_*cat 25

几件事.

  1. set 是一个类级方法,这意味着您要使用每个请求修改整个应用程序的状态
  2. 以上是一个问题,因为可能的话,基本URL在不同请求上可能不同,例如http://foo.com,https://foo.com或者如果您有多个域使用DNS指向同一个应用服务器

更好的策略可能是定义帮助器

helpers do
  def base_url
    @base_url ||= "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您需要在响应查询之外的基本URL(不在get/post/put/delete块或视图中),那么最好在某处手动设置它.