Метапрограммирование синатры получить - PullRequest
3 голосов
/ 31 марта 2011

У меня есть список слов в списке, и я хочу обрабатывать запросы на получение любого из них (и отвечать одинаково).

@words = ["foo","bar"....etc]

Один из способов, которые я мог сделатьэто делается для циклического перемещения по списку и создания директивы get для каждого слова при запуске sinatra.

@words.each do |word|
    get word do
       # what to do
    end
end

, которое не работает, но что-то в этом роде, возможно.

Другим способом сделать это может быть ответ на get %r{/(.+)}, а затем выполнить некоторую обработку внутри него, чтобы посмотреть, соответствует ли он чему-либо в списке и ответить соответствующим образом, но, тем не менее, мне интересно узнать, есть ли способ сделать это, как описановыше.

Ответы [ 2 ]

4 голосов
/ 31 марта 2011
  1. То, что вы написали, работает, с очень незначительными изменениями.Например:

    require 'sinatra'
    %w[foo bar].each do |word|
      get "/#{word}" do
        "You said #{word}!"
      end
    end
    
    $ curl http://localhost:4567/bar
    You said bar!
  2. Вместо универсального маршрута регулярного выражения вы можете динамически создать пользовательское регулярное выражение, чтобы оно соответствовало только словам, которым вы хотите соответствовать:

    require 'sinatra'
    words = %w[foo bar]
    route_re = %r{^/(#{words.join '|'})$}i # case-insensitive
    p route_re
    #=> /^\/(foo|bar)$/i
    
    get route_re do |name|
      "You said #{name}!"
    end
    
    $ curl http://localhost:4567/FoO
    You said FoO!
    
    $ curl -I http://localhost:4567/jim
    HTTP/1.1 404 Not Found
    X-Cascade: pass
    Content-Type: text/html;charset=utf-8
    Content-Length: 413
    Connection: keep-alive
    Server: thin 1.2.7 codename No Hup
2 голосов
/ 31 марта 2011

В зависимости от того, что вам нужно, этого может быть достаточно:

get '/:word' do
  # check if params[:word] is in your list
  # and respond accordingly
  if @words.include?(params[:word])
      "yeeah"
  else
      pass
  end
end

Но имейте в виду, что этот маршрут соответствует всем.

...