views:

332

answers:

2

I have a basic model in which i have specified some of the fields to validate the presence of. in the create action in the controller i do the standard:

@obj = SomeObject.new(params[:some_obj])

if @obj.save
  flash[:notice] = "ok"
  redirect...
else
  flash[:error] = @obj.errors.full_messages.collect { |msg| msg + "<br/>" }
  redirect to new form
end

however when i redirect to the new form, the errors show, but the fields are empty. is there a way to repopulate the fields with the entered values so the errors can be corrected easily?

+5  A: 

You render :action => :new rather than redirecting.

Ryan Bigg
The reason behind this is so that you keep the object in memory rather than creating a new object; the redirect starts an entirely new request.
Ian Terrell
The downside is that the form for creating a SomeObject now has two URLs:/some_objects/new # for the first form/some_objects # after a failed POSTNot much can be done about it, though.
James A. Rosen
Ryan Bigg
+1  A: 

Capture @obj in the flash hash as well, and then check for it in the new action.

@obj = SomeObject.new(params[:some_obj])

if @obj.save
  flash[:notice] = "ok"
  # success
else
  flash[:error] = @obj.errors.full_messages.collect { |msg| msg + "<br/>" }
  flash[:obj] = @obj
  # redirect to new form
end

In new:

@obj = flash[:obj] || MyClass.new
nertzy