Мы можем написать
get '/foo' do
...
end
и
post '/foo' do
...
end
что хорошо. Но могу ли я объединить несколько HTTP-глаголов в один маршрут?
Мы можем написать
get '/foo' do
...
end
и
post '/foo' do
...
end
что хорошо. Но могу ли я объединить несколько HTTP-глаголов в один маршрут?
Это возможно с помощью расширения 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
Вы также можете быть заинтересованы в этом обсуждении этой функции.
FWIW, я просто делаю это вручную, без вспомогательных методов или расширений:
%i(get post).each do |method|
send method, '/foo' do
...
end
end
Хотя, если вы делаете это много, конечно, имеет смысл абстрагировать это.
Phrogz имеет отличный ответ, но если ни лямбды, ни синатра-вклад не для вас, то этот мета-метод достигнет того же результата, что и синатра-вклад для ваших целей:
# 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
Здесь недоступен сервисный сервер, который мне удалось получить на одной строке:)
require 'sinatra';set port: ARGV[0]||80;%w.get post put patch options delete..map{|v|send(v,'*'){503}}
Я действительно использовал это, чтобы проверить поведение некоторого кода клиента в лице 503s.