2013-08-28 13 views
6

Mam formularz, który może być używany zarówno zdalnie, jak i normalnie.Jak zatrzymać wysyłanie formularza zdalnego?

= form_for @comment, html: { class: 'comment-form' }, remote: request.xhr? do |f| 
    = f.text_area :body 
    = f.submit 

Chcę formularz złożyć tylko wtedy, gdy body textarea ma zawartość:

$(document).on 'submit', '.comment-form', (e) -> 
    text = $(this).find('#comment_body').val() 
    false if text.length < 1 

Ten kod działa, gdy formularz nie jest Ajax. Ale gdy jest odległy, zawodzi, a formularz nadal jest przesyłany. Czemu? Próbowałem również:

if text.length < 1 
    e.preventDefault() 
    false 

Używam Rails 4 z Turbolinks.

Aktualizacja: próbowałem wiążące zdarzenie ajax:beforeSend, to nadal utrzymuje:

$(document).on 'page:load', '.comment-form', -> 
    $(this).bind 'ajax:beforeSend', -> 
     alert "hi" 

widzę żadnego wpisu ...

Odpowiedz

0

Może nie miałem na to pytanie, ale nie powinno być wystarczy, aby dodać do swojego text_area?

+0

'required: true' dodaje atrybut HTML5, który nie działa w połowie przeglądarek. To nie jest niezawodne. Przynajmniej nie w tym czasie. – user2630970

+0

Dobrze wiedzieć! Twoje zdrowie. – Miotsu

0

To wygląda jak jquery_ujs kwestii. Spróbuj zmienić wydarzenie na:

$('.comment-form').on 'submit', (e) -> 

Mam do czynienia z tym samym problemem i tylko to rozwiązało problem.

2

Używam Rails 5.0.0.1 i jak opisano w jquery-ujs dokumentacji w Stoppable wydarzeń sekcji trzeba tylko zwrócić wartość false w przypadku ajax:beforeSend zatrzymać żądanie i zapobiegania postać z bycia wysłać.

Tak to działa idealnie dla mnie:

$(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; 
    } 
}); 

Mam nadzieję, że to może być przydatne dla kogoś innego.

+0

Działa. Ale co sprawia, że ​​formularz jest składany dwa razy w pierwszej kolejności? –

+1

Nie wiem, która dokładnie jest twoja sprawa, ale w tym przypadku pytanie brzmiało, jak zapobiec wysłaniu formularza, jeśli wydarzy się coś specjalnego. Miałem podobny przypadek - formularz był * przesyłany dwa razy * _ i dlatego, że w 'link_to' użyłem' remote: true', a jednocześnie miałem i ajax request wywołany jedną z "klas" mój link używał. –

Powiązane problemy