read

The flash hash is designed to carry a message from one action to the next. Here’s a simple example:

def create
  @user = User.create params[:user]
  if @user.save
    flash[:notice] = "User account created - Sweet!"
    redirect_to @user  
  else
    render :action => "new"
  end
end

You’ve probably seen examples like this a hundred times. A new user is created, the flash[:notice] is set to “User account created – Sweet!” and then the user is re-directed to the show action where the notice is displayed. However, if the @user object is not valid, there’s no redirect. Instead, the new template is rendered but we’re still in the create action.

Suppose you wanted to display a message on screen if there’s an error with the user record; a message that will be displayed when the new page is re-rendered. We could use the flash hash here too:

def create
  @user = User.create params[:user]
  if @user.save
    flash[:notice] = "User account created - Sweet!"
    redirect_to @user
  else
    flash[:error] = "Couldn't create user - Damn!"
    render :action => "new"
  end
end

However, because the flash hash is designed to be available to the next action, if the user then moves on to another page they’ll still see the error message displayed on the screen. Not only does this look pretty bad, it could confuse your users if they see an error message when there is no longer an error.

To display a flash message on the current action, a message that will not be carried on to the next action, use flash.now:

def create
  @user = User.create params[:user]
  if @user.save
    flash[:notice] = "User account created - Sweet!"
    redirect_to @user
  else
    flash.now[:error] = "Couldn't create user - Damn!"
    render :action => "new"
  end
end

In this case, the error message will be displayed on screen when the new page is re-rendered but will not be carried on to the next.

Blog Logo

Gavin Morrice

Full-stack developer, based in Scotland


Published

Image

Handy Rails Tips

Ruby on Rails tips and tutorials

Back to home