ruby - rae - Combinación verbal-agnóstica en Sinatra
google agnóstico (4)
Podemos escribir
get ''/foo'' do
...
end
y
post ''/foo'' do
...
end
lo cual está bien. ¿Pero puedo combinar múltiples verbos HTTP en una ruta?
Aquí hay un servidor de servicio no disponible que logré en una sola línea :)
require ''sinatra'';set port: ARGV[0]||80;%w.get post put patch options delete..map{|v|send(v,''*''){503}}
De hecho, utilicé esto para probar el comportamiento de algún código de cliente frente a 503s.
Esto es posible a través de la extensión de multi-route
que es parte de 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
Sin embargo, tenga en cuenta que puede hacerlo usted mismo sin la extensión a través de:
foo = lambda do
# Your route here
end
get ''/foo'', &foo
post ''/foo'', &foo
O más elegantemente como un meta-método:
def self.get_or_post(url,&block)
get(url,&block)
post(url,&block)
end
get_or_post ''/foo'' do
# ...
end
También podría interesarle esta discusión sobre la característica .
FWIW, solo lo hago manualmente, sin métodos de ayuda o extensiones:
%i(get post).each do |method|
send method, ''/foo'' do
...
end
end
Aunque si lo estás haciendo mucho, por supuesto, tiene sentido abstraerlo.
Phrogz tiene una gran respuesta, pero si lambdas o la inclusión de sinatra-contrib no son para usted, entonces este método meta logrará el mismo resultado que sinatra-contrib para sus propósitos:
# 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
Si está un poco desconfiado de poder enviarse métodos arbitrarios a self
, entonces puede protegerse configurando una lista blanca de métodos permitidos en una matriz y luego verificando la presencia del símbolo en la matriz.
# 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