метапрограммирование синатры получить

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

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

Я думал, что один из способов сделать это — пройтись по списку и сгенерировать директиву get для каждого слова при запуске Sinatra.

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

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

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


person hsiu    schedule 30.03.2011    source источник


Ответы (2)


  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
person Phrogz    schedule 30.03.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

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

person scable    schedule 30.03.2011
comment
Ну, вы можете добавить проход в предложении else - person sirfilip; 25.04.2011