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?
This is what worked for me:
Firstly, you can achieve what you're trying to do by setting a single sentence.
I think you could also set it as the array without overflowing the cookie.
But as the other guys say, flash is generally better off being used to return specific messages.
eg.
A common pattern is as such.
Namely, we have two paths.
@record.errors
on hand to callerror_messages_for(@record)
if we so wish.One of the answers to Rails validation over redirect suggests using a new
clone_with_errors
to do a shallow clone of the model's object instance. I guess that might help stay below the 4k limit; however I can imagine that for complex models there could still be problems, e.g. see this page written in 2007 which advocates against storing model object instances in the session.Since flash[:error] is a hash, you can pass error messages to it with an "<<" operator
Flash
is a part of the Rails session which is cleared among requests and Rails session is implemented using cookies. (atleast until Rails-2).Cookies
generally are used to store very minimal amount of data as the maximum amount the default cookie can store is 4 kbs i think. So storing the entire model objects might not be a very good option. To do that you can use a different cookie store which would allow you to store large amount of data.As for the second problem, you can store as many error messages in the flash variable. The way you did
flash[:error]
, you can do the same and store other messages as well using other keys to store other messages.Hope this helps.