views:

42

answers:

2

Hi,

The following code works when I submit the form with valid content. But When I submit the form with invalid content, It validates and shows there is an error and reloads the page. But then the form does not gets submitted. Can you please help me with this? Thanks.

View Code

<h1 class="hdr1">Ask question</h1>

<%= link_to Profile.find(session[:user_id]).firstname,{},{:id=>"person"} %>
<% form_for(@question) do |f| %>
  <%= f.error_messages %>

<br>

<table id="newQuesTable" width="100%" cellpadding="5" border="1">
<tr>
    <td width="25%"><label>Your Question </label> - </td>
    <td><%= f.text_area :content, :rows=>5, :cols=>35, :maxlength=>500, :id=>"newQuesTxtA"%> </td>

<td width="30%"><i><label id="newQuesLabel" style="color:red;background-color:yellow;visibility:visible;"></label></i></td>

</tr>


<tr>
    <td width="25%"><%= f.label :tags %> -</td>
    <td><%= f.text_field :tags, :maxlength=>48, :id=>"tagsNewQuesTxt" %></td>
    <td width="30%"><i><label id="nquesTagsLabel" style="color:red;background-color:yellow;visibility:visible;"></label></i></td>
</tr>


<tr>
    <td>Question Scope -</td>
    <!--the open id for the hierarchy comes here-->
    <!-- the select box comes here -->
    <td> <%= f.text_field :ID_string %></td>
</tr>

</table>

<br>
    <%= f.submit 'Post Question' %> &nbsp; <%= f.submit 'Cancel', :id=>'docNewCancelButton', :type=>'reset' %>

<% end %>

<br>
<hr>
<br>    
<%= link_to 'Back', questions_path %>

Javscript code present in questions.js file

Event.observe(window, 'load', function(){
    $('new_question').observe('submit', submitQuestionCreate);
    $('quesNewCancelButton').onClick('resetquesform')
});

function resetquesform()
{
    event.preventDefault();
    reset($('new_question'));
    return;
}

function submitQuestionCreate(event)
{

    //event.preventDefault();

    var quesfield = $('newQuesTxtA');
    var tagsfield = $('tagsNewQuesTxt');
    var labelnques = $('newQuesLabel');
    var labelnquestags = $('nquesTagsLabel');

    if((quesfield.value == "") && (tagsfield.value == ""))
    {
        event.preventDefault();
        //alert('Question and Tags field cannot be empty');
        labelnques.innerHTML = 'Question field cannot be empty!';
        labelnquestags.innerHTML = 'Please enter (some) relevant tags...';
        probchk = true;
        return;
    }

    if((quesfield.value == "") || (tagsfield.value == ""))
    {
        event.preventDefault();
        if (quesfield.value == "")
        {
            labelnques.innerHTML = 'Question field cannot be empty!';
            labelnquestags.innerHTML = "";
            probchk = true;
            return;
        }

        if (tagsfield.value == "")
        {
            labelnquestags.innerHTML = 'Please enter (some) relevant tags...';
            labelnques.innerHTML = "";
            probchk = true;


            if (quesfield.value.length > 500)
            {
                labelnques.innerHTML = 'Question too long (should be 500 characters or less)';
                probchk = true;
            }

            return;
        }

    }


    if (quesfield.value.length > 500)
    {
        event.preventDefault();
        labelnques.innerHTML = 'Question too long (should be 500 characters or less)';
        probchk = true;
        return;
    }

}

Controller Code

 def show 
       @question = Question.find(params[:id]) 
       if !session[:user_id].nil? 
           #@owner = Document.is_owner(params[:id],session[:user_id]) 
           @fav_count = FavouriteQuestion.count(:all,:conditions=>["question_id = ? AND profile_id = 
                        ?",@question.id,session[:user_id]]) 
           if FavouriteQuestion.count(:all,:conditions=>["question_id = ? AND profile_id = 
                        ?",@question.id,session[:user_id]]) > 0 
                 @fav_status = 1 
           else 
                 @fav_status = 0 
           end
       else 
           @owner = Document.is_owner(params[:id],nil) 
           @fav_status = 0 
       end 
       respond_to do |format| 
          format.html # show.html.erb 
          format.xml { render :xml => @question } 
       end
   end

   def new 
       @question = Question.new 
       if !session[:user_id].nil? 
            @question.profile_id = session[:user_id] 
       end 
       respond_to do |format|  
           format.html # new.html.erb 
           format.xml { render :xml => @question } 
       end 
   end
A: 

If you don't want the form to submit (for example, if there was an error) then use event.preventDefault() and event.stopPropogation(), or just return false. Hope that helps.

CD Sanchez
A: 

There is possibly an exception thrown somewhere in your code because of an fatal error. Because there is no try catch statement at the moment, this exception is uncaught, drop your event.preventDefault() and submit the form anyway.

I would create this try catch statement and add Event.stop(event) in it so it doesn't submit the form in case of an exception.

Zaziffic