Синатра и вопросительный знак

Мне нужно сделать некоторые методы с Sinatra, которые должны выглядеть так:

HTTP//: локальный: 1234/добавить string_to_add

Но когда я объявляю это так:

get "/add?:string_to_add" do
...
end

он не видит параметр string_to_add.

Как мне объявить мой метод и использовать этот параметр, чтобы заставить все работать?

Ответ 1

В URL-адресе знак вопроса отделяет часть путь от запроса. Часть запроса обычно состоит из пар имя/значение и часто создается веб-браузером для соответствия данным, введенным пользователем в форму. Например, URL-адрес может выглядеть так:

http://example.com/submit?name=John&age=93

Здесь раздел пути в /submit, а разделы запроса name=John&age=93, который ссылается на значение "Джон" для ключа name и "93" для age.

Когда вы создаете маршрут в Sinatra, вы указываете только часть пути. Затем Sinatra анализирует запрос и делает данные в нем доступными в params объекте. В этом примере вы можете сделать что-то вроде этого:

get '/submit' do
  name = params[:name]
  age = params[:age]
  # use name and age variables
  ...
end

Если вы используете символ ? при определении маршрута Sinatra, он делает часть URL необязательной. В примере, который вы использовали (get "/add?:string_to_add"), он будет фактически соответствовать любому URL-адресу, начинающемуся с /ad, а затем необязательно другому d, а затем что-нибудь еще будет помещено в ключ :string_to_add хэша params, а раздел запроса будет разобран отдельно. Другими словами, знак вопроса делает предыдущий символ d необязательным.

Если вы хотите получить "сырой текст строки запроса в Sinatra, вы можете использовать метод query_string объекта request. В вашем примере это выглядит примерно так:

get '/add' do
  string_to_add = request.query_string
  ...
end

Обратите внимание, что маршрут не содержит символ ?, а только базу /add.

Ответ 2

Вы должны объявить его как:

get "/add?:string_to_add?" do
...
end