son rae quiénes que los google filosofos etimologia creen consiste componente agnósticos agnóstico agnosticos agnostico ruby sinatra

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