Create and error_messages

If the create fails, the controller could/should (re)render the "new" view.

The "new" view should display there error messages.

The default behavior as exemplified by the scaffold looks something like this in the controller:   def create     @post = Post.new(params[:post])

    respond_to do |format|       if @post.save         flash[:notice] = 'Post was successfully created.'         format.html { redirect_to(@post) }         format.xml { render :xml => @post, :status => :created, :location => @post }       else         format.html { render :action => "new" }         format.xml { render :xml => @post.errors, :status => :unprocessable_entity }       end     end   end

If the save is successful, the user is redirected to the #show view. If the save was unsuccessful, the #new view is rendered.

Notice the difference between a redirect, and a render (this took me a little while to wrap my head around). A redirect tells the browser to grab a completely new page (in this case the page associated with the #show action), A render tells Rails what it should render for the current page (in this case, the #new view).

If you look at the (standard, scaffold generated) #new view, you should see something like:

<h1>New post</h1>

<% form_for(@post) do |f| %>   <%= f.error_messages %>

  <p>     <%= f.label :title %><br />     <%= f.text_field :title %>   </p>   <p>     <%= f.submit 'Create' %>   </p> <% end %>

<%= link_to 'Back', posts_path %>

the f.error_messages displays the error messages associated with @post.

The key here is that @post is initialized to Post.new when the #new action is called, but it contains the (unsaved) record with the bad fields when the #new view is rendered from the #create action.

I hope this made more sense than it confused you.

--wpd