Аргументы Ruby для анализа текущего URI - PullRequest
0 голосов
/ 25 января 2012

Я использую ruby ​​для генерации CGI (не на рельсах).

Я хочу проанализировать аргументы для скрипта, работающего локально (с запросами типа localhost:3000/apage.cgi?key=value), таким же образом, как я бы сделал ARGV[0] для аргументов командной строки.

Когда я пытаюсь: params = CGI.parse(request.query_string), я получаю "неопределенную локальную переменную или запрос метода".

РЕДАКТИРОВАТЬ: Вот код.Вот почему я не поставил это на первое место:)

#!/usr/bin/env ruby
require 'cgi'
print "Content-type: text/plain\n\n"
#print CGI.parse(URI.parse(request.fullpath).query)

Ответы [ 3 ]

1 голос
/ 25 января 2012

Ваш сценарий верен, у вас действительно нет request в этом коде. Лучше использовать fcgi вместо cgi, вот пример:

#!/usr/bin/env ruby

require 'fcgi'
require 'rack'


# this class made fcgi env compatible with rack
class Rack::PathInfoRewriter
  def initialize
  end

  def call(env)
    # here you can place initialization of you app
    request = Rack::Request.new env

    # here is params. You can also find all info about request in this object  
    request.params 

    # you app should return result in such format
    [200, "Content-type: text/plain", ['html']]
  end
end

Rack::Handler::FastCGI.run Rack::PathInfoRewriter.new
1 голос
/ 25 января 2012

Я предполагаю, что у вас есть веб-сервер, который поддерживает интерфейс CGI.

Попробуйте этот скрипт:

require 'cgi'

cgi = CGI.new
cgi.out{ ENV['REQUEST_URI'] } 

Это будет ответ с текстом, содержащим ваш запрос.

0 голосов
/ 25 января 2012

Когда мне нужно разобрать URL-адреса, я использую либо встроенный в Ruby модуль URI , либо Addressable gem.

Используя URI, вам необходимодобавьте протокол, чтобы получить правильное поведение:

URI.parse('http://' + 'localhost:3000/apage.cgi?key=value').query # => "key=value"

Вы можете создать хэш значений с немного большим массажем:

Hash[URI.parse('http://localhost:3000/apage.cgi?key=value').query.split('&').map{ |q| q.split('=') }]
{
    "key" => "value"
}

Hash[URI.parse('http://localhost:3000/apage.cgi?key=value&foo=bar').query.split('&').map{ |q| q.split('=') }]
{
    "key" => "value",
    "foo" => "bar"
}

Аналогично, используя Addressable:

require "addressable/uri" # => true
uri = Addressable::URI.parse('http://' + 'localhost:3000/apage.cgi?key=value')
#<Addressable::URI:0x100c80978
    @uri_string = nil,
    @validation_deferred = false,
    attr_accessor :authority = nil,
    attr_accessor :host = "localhost",
    attr_accessor :path = "/apage.cgi",
    attr_accessor :port = 3000,
    attr_accessor :query = "key=value",
    attr_accessor :scheme = "http",
    attr_reader :hash = nil,
    attr_reader :normalized_host = nil,
    attr_reader :normalized_path = nil,
    attr_reader :normalized_port = nil,
    attr_reader :normalized_query = nil,
    attr_reader :normalized_scheme = nil
>
uri.query # => "key=value"
uri.query_values # => {"key" => "value"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...