# Ajax and browser 'back' button

**URL:** <https://www.ruby-forum.com/t/ajax-and-browser-back-button/142469>\
**Category:** Rails\
**Created:** [July 8, 2008, 10:46am UTC](https://www.ruby-forum.com/t/ajax-and-browser-back-button/142469 "2008-07-08T10:46:16Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![dekhaus](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c37758/32.png) [@dekhaus](https://www.ruby-forum.com/u/dekhaus)\
**Post date:** [July 8, 2008, 10:46am UTC](https://www.ruby-forum.com/t/ajax-and-browser-back-button/142469/1 "2008-07-08T10:46:16Z")

</div>

Hi

I’m trying to find a solution to what I would describe as  
inconsistent state of session objects updated from multiple pages  
using Ajax techniques.

A concrete example would help.

The ‘Agile Web D. with Rails’ book includes the development  
of a sample application called the Depot application. Its a shopping  
application - where the user shops for books, places them in a ‘cart’,  
and ultimately ‘checks out’.

The Depot application has a page where you can see all the available  
books - along the left-nav there’s also a summary of the users  
‘cart’. Every time a user adds a book to their cart - the left-nav  
summary is updated accordingly. In addition - assume there’s a link  
on this page - let’s call it the ‘shopping’ page, that allows a user  
to go to another page and edit the contents of their cart - let’s call  
that page the ‘edit cart’ page.

Imagine a user has added 4 books on the ‘shopping’ page, then they go  
to the ‘edit cart’ page and delete all the items from their cart -  
books are removed from the ‘cart object’ every time the user deletes a  
book from their cart. The cart object is stored in the session. They  
then hit the browser’s ‘back’ button - taking them back to the  
‘shopping’ page - which shows the cart containing 4 books in the left-  
nav summary - the same books that were in the cart when the user  
initially left the ‘shopping’ page. If the user refreshes the  
‘shopping’ page - the cart is now empty, correctly reflecting the  
contents of the cart.

I found what appears to be a solution that works ‘sometimes’. I  
don’t mean to be imprecise - but it literally works sometimes in  
production mode and sometimes not. I have no idea why.

The fix can be explained here …

```
http://giantrobots.thoughtbot.com/2008/4/25/pitfalls-in-restful-wizards

```

and amounts to adding a ‘filter’ which calls a private ‘no\_cache’  
method defined in application.rb …

def no\_cache  
response.headers[“Last-Modified”] = Time.now.httpdate  
response.headers[“Expires”] = 0

```
# HTTP 1.0
response.headers["Pragma"] = "no-cache"

# HTTP 1.1 'pre-check=0, post-check=0' (IE specific)
response.headers["Cache-Control"] = 'no-store, no-cache, must-

```

revalidate, max-age=0, pre-check=0, post-check=0’  
end

I then added the following line to the controller/actions that I want  
to not be cached …

```
after_filter :no_cache, :only => [:index]

```

Note: the link I included above uses a ‘before’ filter, and in my  
testing that didn’t seem to work - but an ‘after’ filter did.

Now - like I said above, it works sometimes, other times not. So my  
question - does anyone know why ?

Additionally - is there a reliable browser agnostic fix that can  
address the underlying issue - specifically, force pages that users  
return to when hitting the browse button to not be cached and actually  
request the page from the server?

Any help would be greatly appreciated. Thanks for making it this far  
and sorry for the length of the post.

Dave
