Как получить доступ к параметрам запроса html для страницы .rhtml, обслуживаемой webrick? - PullRequest
4 голосов
/ 02 мая 2010

Я использую webrick (встроенный сервер ruby) для обслуживания файлов .rhtml (html со встроенным ruby-кодом - как jsp).

Работает нормально, но не могу понятькак получить доступ к параметрам (например, http://localhost/mypage.rhtml?foo=bar) из кода ruby ​​в файле .rhtml. (Обратите внимание, что я не использую платформу rails, только файлы webrick + .rhtml)

Спасибо

Ответы [ 4 ]

3 голосов
/ 02 мая 2010

Это решение:

(предположим, запрос http://your.server.com/mypage.rhtml?foo=bar)

 <html>

    <body>

    This is my page (mypage.rhtml, served by webrick)

    <%
    # embedded ruby code

    servlet_request.query ["foo"] # this simply prints bar on console

    %>

    </body>

</html>
3 голосов
/ 02 мая 2010

Согласно исходному коду erbhandler, он запускает файлы rhtml следующим образом:

    Module.new.module_eval{
      meta_vars = servlet_request.meta_vars
      query = servlet_request.query
      erb.result(binding)
    }

Таким образом, привязка должна содержать query (которая содержит хэш строки запроса) и meta_vars переменную (которая содержит хэш среды, например SERVER_NAME), к которым вы можете обращаться в файлах rhtml (и servlet_request и servlet_response также могут быть доступны, но я не уверен в них).

Если это не так, вы также можете попробовать запросить параметр CGI ENV["QUERY_STRING"] и проанализировать его, но это должно быть только в качестве крайней меры (и это может работать только с файлами CGI).

1 голос
/ 02 мая 2010

Вы не даете много подробностей, но я думаю, что у вас есть сервлет для обслуживания файлов, которые вы будете обрабатывать с помощью erb, и по умолчанию веб-сервер обслуживает любой статический файл в общедоступном каталоге.

require 'webrick'
include WEBrick
require 'erb'

s = HTTPServer.new( :Port => 8080,:DocumentRoot    => Dir::pwd + "/public" )

class MyServlet < HTTPServlet::AbstractServlet
  def do_GET(req, response)
    File.open('public/my.rhtml','r') do |f|
     @template = ERB.new(f.read)
    end
    response.body = @template.result(binding)
    response['Content-Type'] = "text/html"
   end
end

s.mount("/my", MyServlet)

trap("INT"){
  s.shutdown
}
s.start

Этот пример ограничен, когда вы переходите в / my, всегда обрабатывается один и тот же файл. Здесь вы должны построить путь к файлу на основе пути запроса. Здесь я сказал важное слово: «запрос», там есть все, что вам нужно.

Чтобы получить параметры заголовка HTTP, используйте req [header_name]. Чтобы получить параметры в строке запроса, используйте req.query [param_name]. req - это объект HTTPRequest, переданный сервлету.

Как только у вас есть нужный параметр, вы должны привязать его к шаблону. В этом примере мы передаем объект привязки от себя (привязка определена в ядре и представляет контекст, в котором выполняется код), поэтому каждая локальная переменная, определенная в методе do_GET, будет доступна в шаблоне. Однако вы можете создать свою собственную привязку, например, передав объект Proc и передавая его процессору ERB при вызове «result».

Все вместе, ваше решение будет выглядеть так:

  def do_GET(req, response)
    File.open('public/my.rhtml','r') do |f|
     @template = ERB.new(f.read)
    end

    foo = req.query["foo"]
    response.body = @template.result(binding)
    response['Content-Type'] = "text/html"
   end
1 голос
/ 02 мая 2010

Просмотр документации , похоже, у вас должно быть HTTPRequest, из которого вы можете получить строку запроса. Затем вы можете использовать parse_query, чтобы получить хэш имени / значения.

Кроме того, возможно, что простой вызов query() даст вам хеш напрямую ... мой Ruby-fu не совсем подходит, но вы можете хотя бы попробовать его.

...