alexs333 alexs333 - 10 months ago 55
Ruby Question

Passing error messages through flash

What is the best way to push error messages on redirect to?

I've previously used couple of approaches, but both of them has issue.

(1) Passing the entire object with error on flash and using error_messages_for:

def destroy
if @item.destroy
flash[:error_item] = @item
redirect_to some_other_controller_path

I found that this method causes cookie overflows.

(2) Passing a single error message:

def destroy
if @item.destroy
flash[:error] = @item.full_messages[0]
redirect_to some_other_controller_path

This way I only send a single error message, what if there are many?
Does Anyone knows a better way?

Answer Source

Firstly, you can achieve what you're trying to do by setting a single sentence.

flash[:error] = @item.errors.full_messages.to_sentence

I think you could also set it as the array without overflowing the cookie.

flash[:error] = @item.errors.full_messages

But as the other guys say, flash is generally better off being used to return specific messages.


flash[:error] = "We were unable to destroy the Item"

A common pattern is as such.

def some_action
  if @record.action
    flash[:notice] = "Action performed successfully"
    redirect_to @record      
    flash[:error] = "Action failed"
    render :action => "some_action"

Namely, we have two paths.

  1. Action succeeds. We redirect.
  2. Action fails. We show a page, flash an error, and have @record.errors on hand to call error_messages_for(@record) if we so wish.