Using Redirects
Using Redirects
After handling a POST (or PUT or DELETE) request, in today’s web applications it is common to redirect the browser to the page that displays the changed state:
Our application would respond: “Alright, I’ve done this! Go here, check it out!”
The way of expressing this in terms of HTTP is returning the status code 303 See Other, and adding a location header to the response that tells the browser where to go (what to GET) next.
HTTP/1.1 303 See Other
Location: http://localhost:4567/monstas
Hmm, ok. But how do we achieve that in Sinatra?
Remember Sinatra calls itself a DSL? It has a method redirect for that:
post "/monstas" do
@name = params[:name]
store_name("names.txt", @name)
redirect "/monstas"
end
The redirect method will make sure our application responds with the status code 303 and add a location header to the response with the value http://localhost:4567/monstas (since we have passed the path /monstas, but the location header needs a full URL).
We also want to see the the Welcome message when we post a new name. For that to work, we can redirect to "/monstas?name=#{@name}". Our GET route will then include (“render”) the name into the HTML page:
post "/monstas" do
@name = params[:name]
store_name("names.txt", @name)
redirect "/monstas?name=#{@name}"
end
If you restart the server, go to <http://localhost:4567/monstas>, and submit the form you’ll see that your browser will be redirected, and make a new GET request to the same URL.
So this is pretty cool. We now have two routes: One for displaying (GETing) the current state of our application, and one for storing (POSTing) new data.
Awesome!
