如何在Ruby Sinatra类上下文中获取请求URL?

时间:2018-11-20 14:20:58

标签: ruby sinatra

在Sinatra中,您可以使用以下几行来获取请求的完整路径:

get '/hello-world' do
  request.path_info   # => '/hello-world'
  request.fullpath    # => '/hello-world?foo=bar'
  request.url         # => 'http://example.com/hello-world?foo=bar'
end

我在应用程序中使用了几个类。在这一特定类中,我喜欢将request.path_info与字符串进行比较。

class foo
  def build_menu
    if request.path_info == "/hello-world"
      highlight_menu_entry
    end
  end
end

但是request-Object在此类上下文中未知,并且会引发错误。尽管在Ruby / Sinatra中有一些功能,但我还是像PHP $_POST$_GET中的SUPER-GLOBAL。

那么如何在类上下文中检查request.path

2 个答案:

答案 0 :(得分:1)

您可以将值传递给您的班级:

class Foo
  attr_accessor :request_path_info, :request_fullpath, :request_url
  def build_menu
    highlight_menu_entry if request_path_info == '/hello-world'
  end
end

foo = Foo.new

get '/hello-world' do
  foo.request_path_info = request.path_info
  foo.request_fullpath = request.fullpath
  foo.request_url = request.url
end

foo.build_menu

答案 1 :(得分:0)

我自己找到了答案。我使用自定义的全局变量$PATHNAME,可以在任何上下文中使用。结合主应用程序中的before do预处理器,我可以填充use变量。

before do
  $PATHNAME=request.path_info
end

class Foo
  def build_menu
    highlight_menu_entry if $PATHNAME == '/hello-world'
  end
end