2010-04-24 20 views
9

Próbuję przekazać dane między blokami za pomocą sinatry. Na przykład:Przekazywanie danych między blokami za pomocą sinatry

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

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

Jednak za każdym razem, gdy dostaję się do bloku tmp, @ data jest zerowa i powoduje błąd. Dlaczego?

Odpowiedz

14

Powodem jest fakt, że przeglądarka faktycznie wykonuje dwa oddzielne żądania HTTP.

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

Dwie prośby oznaczają dwa oddzielne procesy, a więc zmienna instancji @data jest czyszczona po wysłaniu pierwszej odpowiedzi. Jeśli chcesz zachować informacje, trzeba wykorzystywać cookies lub sesji, inaczej przekazać dane z kwerendy

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

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

One wspólną potrzebę ma być w stanie wyświetlić błędów/zawiadomień gdy przekierowanie. Wygląda na to, że niektórzy ludzie używają [flash-gem gem] (https://github.com/SFEley/sinatra-flash) do tego, który używa strategii opartej na sesji. Zobacz http://stackoverflow.com/a/7178664/1154642 – bryanbraun

Powiązane problemy