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!