Error handling on ajax form

I have a page displaying a form and a table. The form is used to add record to the table using ajax. I am using jQeury for this. Submitting the form with all fields filled in works just fine, but when I leave field empty it does not work. Probably because the jQuery code tries to add a partial (containing one row) to to the bottom of the table for the new object that could not be created because fields where empty.

My create action now looks like this:   def create     @project = Project.new(params[:project])     @project.save     @current_project = @project     flash[:notice] = 'Successfully created project.'     respond_to do |format|       format.js       format.html { redirect_to projects_url }     end   end

What do I have to add to my code in order to get the form validation to work properly with my ajax form?

I have a page displaying a form and a table. The form is used to add record to the table using ajax. I am using jQeury for this. Submitting the form with all fields filled in works just fine, but when I leave field empty it does not work.

What does not work? Is the Project not created? Are you getting an exception (and if so, what is the full exception + backtrace)?

Probably because the jQuery code tries to add a partial (containing one row) to to the bottom of the table for the new object that could not be created because fields where empty.

Have you checked the development log to see if extraneous, blank fields actually are being sent in the POST request?

My create action now looks like this: def create @project = Project.new(params[:project]) @project.save @current_project = @project flash[:notice] = 'Successfully created project.' respond_to do |format| format.js format.html { redirect_to projects_url } end end

You have no error checking in your controller, so if you're wondering why there's no validation in your app, this is a good place to start. Read http://guides.rubyonrails.org/activerecord_validations_callbacks.html, its an excellent Primer for how ActiveRecord validations work and how to work with them in your controller code and views.

> I have a page displaying a form and a table. The form is used to add > record to the table using ajax. > I am using jQeury for this. > Submitting the form with all fields filled in works just fine, but > when I leave field empty it does not work.

What does not work? Is the Project not created? Are you getting an exception (and if so, what is the full exception + backtrace)?

When I submit the empty form nothing happens in the browser. The project is not created also no exception is raised. On the project model I defined these validations:   validates_presence_of :name   validates_presence_of :description

> Probably because the jQuery code tries to add a partial (containing > one row) to to the bottom of the table for the new object that could > not be created because fields where empty.

Have you checked the development log to see if extraneous, blank fields actually are being sent in the POST request?

Yes, blank fields are send in the POST request.

In the development log i found this: ActionView::TemplateError (edit_project_url failed to generate from {:controller=>"projects", :action=>"edit", :id=>#<Project id: nil, name: "", description: "", created_at: nil, updated_at: nil, startdate: "2009-10-26", enddate: "2009-10-26">}, expected: {:controller=>"projects", :action=>"edit"}, diff: {:id=>#<Project id: nil, name: "", description: "", created_at: nil, updated_at: nil, startdate: "2009-10-26", enddate: "2009-10-26">}) on line #12 of app/ views/projects/_project.html.erb: 9: <td><%=h project.enddate %></td> 10: <td class="row-nav"> 11: <%= link_to "Show", project %> 12: <%= link_to "Edit", edit_project_path(project) %> 13: <%= link_to "Destroy", project, :confirm => 'Are you sure?', :method => :delete %> 14: </td> 15: </tr>

This is there because my javascript code in create.js.erb that gets executed on the format.js response tries to render that _project partial in my view.

> My create action now looks like this: > def create > @project = Project.new(params[:project]) > @project.save > @current_project = @project > flash[:notice] = 'Successfully created project.' > respond_to do |format| > format.js > format.html { redirect_to projects_url } > end > end

You have no error checking in your controller, so if you're wondering why there's no validation in your app, this is a good place to start. Readhttp://guides.rubyonrails.org/activerecord_validations_callbacks.html, its an excellent Primer for how ActiveRecord validations work and how to work with them in your controller code and views.

Thanks for the link.

Of course I can change the create action something like this:   def create     @project = Project.new(params[:project])     if @project.save       @current_project = @project       flash[:notice] = 'Successfully created project.'       respond_to do |format|         format.js         format.html { redirect_to projects_url }       end     else       flash[:notice] = 'Failed to create a new project.'       render :action => 'index'     end   end

But how do I show the validation messages on the index view? In my view I have this: <%= error_messages_for :project %> But it does not show anything when I submit an empty form with the create action code from just above. Also the 'Failed to create a new project.' does not show.