I have a form that can be used both remotely and normally.
= form_for @comment, html: { class: 'comment-form' }, remote: request.xhr? do |f|
= f.text_area :body
= f.submit
I want the form to submit only if the body
textarea has content:
$(document).on 'submit', '.comment-form', (e) ->
text = $(this).find('#comment_body').val()
false if text.length < 1
That code works when the form is not Ajax. But when it's remote, it fails and the form still submits. Why? I also tried:
if text.length < 1
e.preventDefault()
false
I'm using Rails 4 with Turbolinks.
Update: I tried binding the ajax:beforeSend
event, it still submits:
$(document).on 'page:load', '.comment-form', ->
$(this).bind 'ajax:beforeSend', ->
alert "hi"
I see no alert...
You could potentially implement a handler for the ajax:beforeSend
event to prevent your form from being submitted. It looks like the submit stops if your event handler returns false
.
Wiki: https://github.com/rails/jquery-ujs/wiki/ajax
Example implementation: Stop $.ajax on beforeSend
I'm using Rails 5.0.0.1
and as described at jquery-ujs documentation in Stoppable events section you only need to return a false
value in the ajax:beforeSend
event to stop the request and prevent the form from being send.
So this works perfectly for me:
$(document).on("ajax:beforeSend", "form#messages_form", function (e, data, status, xhr) {
var len = $.trim($('#message_body').val()).length;
if (len > 3) {
console.log("Send form!");
return true;
} else {
console.log("Stopping request...");
return false;
}
});
I hope it could be useful for somebody else.
Maybe I didn't get your question, but shouldn't it be enough to add a
:required => true
to your text_area
?
This looks like a jquery_ujs issue. Try changing the event to:
$('.comment-form').on 'submit', (e) ->
I'm facing the same issue and only this solved the problem.
来源:https://stackoverflow.com/questions/18490396/how-do-i-stop-a-remote-form-from-submitting