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