2010-04-24 20 views
9

Estoy tratando de pasar datos entre bloques usando sinatra. Por ejemplo:Pasar datos entre bloques usando sinatra

@data = Hash.new 
post "/" do 
    @data[:test] = params.fetch("test").to_s 
    redirect "/tmp" 
end 

get "/tmp" do 
    puts @data[:test] 
end 

Sin embargo, cada vez que llego al bloque tmp, @data es nulo y arroja un error. ¿Porqué es eso?

Respuesta

14

La razón es porque el navegador realmente realiza dos solicitudes HTTP por separado.

Request: POST/
Response: 301 -> Location: /tmp 
Request: GET /tmp 
Response: ... 

Dos solicitudes significan dos procesos separados, por lo que la variable de instancia @data se borra una vez que se envía la primera respuesta. Si desea conservar la información, es necesario el uso de cookies o sesiones, de lo contrario pasar los datos en la cadena de consulta

post "/" do 
    test = params[:test] 
    redirect "/tmp?test=#{test}" 
end 

get "/tmp" do 
    puts params[:test] 
end 
+0

Una necesidad común es la de ser capaz de mostrar errores/avisos al redirigir. Parece que algunas personas usan la [gema sinatra-flash] (https://github.com/SFEley/sinatra-flash) para eso, que usa una estrategia basada en sesiones. Ver http://stackoverflow.com/a/7178664/1154642 – bryanbraun

Cuestiones relacionadas