Forum: Ruby on Rails How to redisplay submitted data on validation error?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
F639e0cdf2fa098b535d6ec766b2aee1?d=identicon&s=25 Szymon Nowak (g0nzo)
on 2006-03-23 17:21
Hi!

If i have an object it's easy.
But i'm making a simple contact form and i check if email address is
correct. If it's not i redisplay the form with the info that there was
an error (should i use redirect_to or render :action? what's the
difference?), but all previously submitted data is lost.
I tried creating variables using names of the form fields, but it didn't
work.
A2c85dc5ee81b12e3cc0a6522e8d079d?d=identicon&s=25 Chris Hall (Guest)
on 2006-03-23 18:35
(Received via mailing list)
render :action overrides the default render for the current action with
the
render of another action.
redirect_to effectively sends a header to the browser telling it to load
a
new URL (controller/action) specified in the redirect_to call.  you
won't
have any access to the data that was used in the action unless its in
the
session.

to explain what is happening below, when you go to the new action, rails
creates an empty model.  that model's data is then used to populate the
form
in the view.  since it's an 'empty' model, the fields are empty.  the
user
then fills out the form and submits to the create action.  the create
action
creates a model from the submitted data and attempts to save it.  if the
save is successful, the browser is redirected to the list action.  if
the
save is unsuccessful, the view for the new action is rendered.  in this
case, we have a model instance loaded with the submitted data, so when
the
new form is displayed, the data from the model is used to populate the
form.  the form helpers are smart and know if a model has errors and
will
automatically hilight the fields with errors for you (see comments below
example).

class ExampleController < ApplicationController
  def new
    @model = Model.new
  end

  def create
    @model = Model.new(@params[:model]
    if @model.save
      redirect_to :action => :list
    else
      render_action => :new
    end
  end
end

new.rhtml

<%= form_start_tag :action => :create %>
    <label for="model_email"><%= text_field :model, :email %>
    <%= submit_tag "Submit" %>
<%= form_end_tag %>


By using the helper methods this way (ie, text_field as opposed to
text_field_tag), Rails will automatically repopulate the fields with the
data that was submitted and hilight the fields with errors.  you'll need
to
either include the scaffold.css file or define .fieldWithErrors yourself
for
the hilight to work.

in addition to this, you can use error_messages_for(:model) to provide a
descriptive message as to why the fields have errors.  this also relies
on
some style definitions found in scaffold.css.

hope this helps.

Chris
F639e0cdf2fa098b535d6ec766b2aee1?d=identicon&s=25 Szymon Nowak (g0nzo)
on 2006-03-23 18:54
Thanks!

It cleared up few things for me.

However if i don't have any model for my contact form and i'd like to
redisplay submitted data, what then? Can submitted data be redisplayed
without using a model? Or should i just create a model for it? I'm using
the submitted data only to send it by email, i don't store them
anywhere. But it looks like creating a model would really simplify
things (like validation).
F639e0cdf2fa098b535d6ec766b2aee1?d=identicon&s=25 Szymon Nowak (g0nzo)
on 2006-03-23 19:44
I've created ContactForm model (using this tutorial:
http://rails.techno-weenie.net/tip/2005/11/19/vali...)
and added email verification to it.

Now redisplaying submitted data works and the code is simpler than
before :)
This topic is locked and can not be replied to.