The Back Button and multiple form submits

Pretty standard stuff: 1. User fills out form 2. User submits form 3. User thinks "doh! an error!" 4. User hits the browser back button 5. User updates the data in the form 6. User *thinks* he is updating the data by hitting submit again, but inserts another record.

Now we have two records in the database, one is the correct one, and one is the bad one. How do we know witch one is the good one? The second one! I hear you all scream. But does that mean we should delete the first one? How do you deal with this situation? I think it is quite obvious what the user intended to do, and we should, in our webapp, do what the user wanted to do, not annoy him with stupid error messages like "Sorry, you can't submit the same form twice", or "Sorry, a record with this ID already exists in our database" Is there a nice solution in rails to this very frequent problem in web applications?

Thanks

It is a difficult problem to deal with, since Tech-savvy users will press the BACK button when they actually WANT a second record in the database!

One method I have used is to redirect to the edit page after a create has been performed. For example

def create   @object = Object.new   if @object.save     redirect_to :action => 'edit'   eles     render :action => 'new'   end end

then they aren't tempted to press back because they are already at the edit page.

I hope that helps.

S2 akira wrote:

DyingToLearn wrote:

It is a difficult problem to deal with, since Tech-savvy users will press the BACK button when they actually WANT a second record in the database!

One method I have used is to redirect to the edit page after a create has been performed. For example

def create   @object = Object.new   if @object.save     redirect_to :action => 'edit'   eles     render :action => 'new'   end end

then they aren't tempted to press back because they are already at the edit page.

I hope that helps.

I found out that FF and IE "disable" the back button for a particular form if you submit the form to the page that rendered the form itself (I typed this by hand, it could not work as written here, but the concept is valid):

$ rails test $ cd test $ ruby script/generate controller back $ cat > app/controllers/back_controller.rb class BackController < ApplicationController

  def backtest     if request.method == :post       session[:state] = 'saved'       redirect_to :action => 'backtest'     end   end

  def clear     session[:state] = nil     redirect_to :action => 'backtest'   end end

^D

$ cat > app/views/back/backtest.html.erb <html> <head> <title>Backtest</title> </head>

<body>   <% if session[:state] %>     <%= 'Record saved' %>   <% else %>     <% form_tag :action => "backtest" do %>       <input type="submit" value="Submit">     <% end %>   <% end %> </body> </html>

^D

Now, if you go to http://localhost:3000/back/backtest and hit submit, you get the 'Record saved' message, but the back button of the browser does not take you back to the form.