Hypertext Transfer Protocol (HTTP) is the data communication protocol for the World Wide Web; it defines how a client (web browser) communicates with a web server.
The Limitation of HTTP
HTTP is a stateless protocol — meaning that information communicated between the client and the server is not preserved between requests. This poses a challenge for web applications that need to remember information about an end-user. For example, when an user places a product in her virtual shopping cart on Amazon.com, the product should remain in her shopping cart until she's ready to checkout. Products in her shopping cart should not be lost when she navigates to a different page to view another product.
The Rails Flash
As one solution to overcome the stateless limitation of HTTP, most web application frameworks — Ruby on Rails included — implement what is referred to as a session. The session allows data associated with an user to persist over multiple requests.
In addition to the session, Rails provides an object called the flash. Whereas the session persists data over multiple requests, data stored in the flash is only kept around for one request.
One of the most common uses of the flash is to store a message in the controller layer that is accessed from the view layer to relay information to the end-user.
The message is stored in the flash prior to performing a redirect in the controller:
flash[:notice] = "Product added to shopping cart" redirect_to root_path
In the view, the message is displayed using HTML markup:
<%= flash[:notice] %>
The message is discarded after the view is rendered.
Preserving Data in the Flash Hash for More Than One Request
There are times — albeit rare — when it's necessary to keep data stored in the flash around for an additional request. In these cases, the flash provides a method called keep:
def create ... flash[:notice] = "Keep this message around" redirect_to action: :index end def index ... flash.keep redirect_to action: :somewhere_else end def somewhere_else end
In this example, data will remain in the flash for two requests (two redirects), allowing the view for the somewhere_else action to render the message that was stored in the flash in the create action.
The Rails flash also provides a method called discard. As you may have guessed, it is used to remove data from the flash.
Take a look at the Rails API documentation for more details on the flash here.