Flash[] not shown

I am using the following code (inspired by one of the books) to check if
the user’s session should have timed out.

Check to see if the user has been inactive for longer than the

expiry period. If they have, reset the session.

def check_timeout
if session[:expires_at] != nil
@time_left = (session[:expires_at] - Time.now).to_i
unless @time_left > 0
reset_session
# TODO - This flash is never shown, because we redirect maybe?
flash[:error] = ‘Your session has timed out, please login to
continue.’
redirect_to :controller => ‘security’, :action => ‘login’ and
return false
end
end
end

However, the flash is never shown. The view includes the correct code
and a flash is shown if the user enters an incorrect username/password.
At one point, the flash did work (before I changed some code) but I have
no idea what actually broke it.

The same happens for the logout event, which simply calls reset_session,
sets the flash then redirects as above (in that order, so I’m not wiping
the flash out from the session I hope).

Is there any reason that the flash wouldn’t be shown?

Cheers.

I don’t know if it’s relevant or not, but when i implemented the
‘lightning
fast javascript auto completion’ recipe, which involved using a
controller
action to load a javascript file, that action ate my flash before it got
where it was supposed to go - the next ‘real’ action.

I had to put a flash.keep statement in that action so that the contents
would survive til the next real load.

how to handle multiple flash keys (See related posts)
posted by Scott R. on rails list

I generally like to add something like this to my application_helper.rb:

def flash_div *keys
keys.collect { |key| content_tag(:div, flash[key],
:class => “flash_#{key}”) if
flash[key] }.join
end

…and then this in the section of layouts/application.rhtml:

<%= flash_div :warning, :notice %>

Now, if my controller puts anything into flash[:warning] or
flash[:notice],
they’ll render like:

Warning here
Notice here

Handling the CSS styling

.flash_notice {
color: green;
font-size: 8pt;
}