alexs333 alexs333 - 1 month ago 12
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
end
redirect_to some_other_controller_path
end


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]
end
redirect_to some_other_controller_path
end


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

Answer

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.

eg.

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      
  else
    flash[:error] = "Action failed"
    render :action => "some_action"
  end
end

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.