Сопоставление глаголов с синатрой - PullRequest
27 голосов
/ 07 декабря 2011

Мы можем написать

get '/foo' do
  ...
end

и

post '/foo' do
  ...
end

что нормально. Но можно ли объединить несколько HTTP-глаголов в одном маршруте?

Ответы [ 4 ]

33 голосов
/ 08 декабря 2011

Это возможно через multi-route расширение , которое является частью sinatra-contrib:

require 'sinatra'
require "sinatra/multi_route"
route :get, :post, '/foo' do
  # "GET" or "POST"
  p request.env["REQUEST_METHOD"]
end

# Or for module-style applications
class MyApp < Sinatra::Base
  register Sinatra::MultiRoute
  route :get, :post, '/foo' do
    # ...
  end
end

Тем не менее, обратите внимание, что вы можете сделать это самостоятельно без расширения через:

foo = lambda do
  # Your route here
end
get  '/foo', &foo
post '/foo', &foo

Или более элегантно, как мета-метод:

def self.get_or_post(url,&block)
  get(url,&block)
  post(url,&block)
end

get_or_post '/foo' do
  # ...
end

Вас также может заинтересовать обсуждение этой функции .

8 голосов
/ 07 июля 2014

FWIW, я просто делаю это вручную, без вспомогательных методов или расширений:

%i(get post).each do |method|
   send method, '/foo' do 
       ...
   end
 end

Хотя, если вы делаете это много, конечно, имеет смысл абстрагироваться от этого.

4 голосов
/ 22 августа 2013

У Phrogz отличный ответ, но если лямбды или включая sinatra-contrib не для вас, то этот мета-метод даст тот же результат, что и sinatra-contrib для ваших целей:

# Provides a way to handle multiple HTTP verbs with a single block
#
# @example
#   route :get, :post, '/something' do
#       # Handle your route here
#   end
def self.route(*methods, path, &block)
    methods.each do |method|
        method.to_sym
        self.send method, path, &block
    end
end

Если вы немного опасаетесь возможности отправлять произвольные методы на self, тогда вы можете защитить себя, настроив белый список разрешенных методов в массиве, а затем проверив наличие символа в массиве.

# Provides a way to handle multiple HTTP verbs with a single block
#
# @example
#   route :get, :post, '/something' do
#       # Handle your route here
#   end
def self.route(*methods, path, &block)
    allowed_methods = [:get, :post, :delete, :patch, :put, :head, :options]
    methods.each do |method|
        method.to_sym
        self.send(method, path, &block) if allowed_methods.include? method
    end
end
0 голосов
/ 21 июня 2014

Вот сервер, недоступный для службы, который мне удалось получить в одну строку:)

require 'sinatra';set port: ARGV[0]||80;%w.get post put patch options delete..map{|v|send(v,'*'){503}}

Я фактически использовал это, чтобы проверить поведение некоторого клиентского кода перед лицом 503-х.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...