2011-12-20 10 views
13

W moim szynach app mam zdalny formularz, który wygląda mniej więcej tak na przykład:złożyć Rails postać pilota z javascript

<%= form_tag some_path, :method => :get, :id => 'my-form', :remote => true do %> 
    <%= text_field_tag :search, params[:search], :id => 'search-field' %> 
    <%= submit_tag 'Go' %> 
<% end %> 

Teraz chciałbym przesłać ten formularz za pomocą JavaScript i wyzwolić wszystkich szyn formularz zdalnego callbacks. Do tej pory próbowałem kilku rzeczy, ale nic nie działa.

Co próbowałem:

$('#my-form').trigger('onsubmit') 

$.rails.callFormSubmitBindings($('#search-form')) 

ale nie ma szczęścia do tej pory. Jakieś pomysły?

+1

Co z '$ (" # mój-formularz "). Submit()'? Czy wywołuje niezbędne wywołania zwrotne? Wiem, że użyłem podobny w [mój własny kod] (https://github.com/BinaryMuse/BG-Tracker/blob/01a958924fc8cc67c0effa340e72ede43298b8fd/app/assets/javascripts/battlegroups.js.coffee#L5). –

+0

Tak, to prawda! : P – Matthew

Odpowiedz

7

Możesz po prostu użyć .submit();

$("#my-form").submit(); 
+0

Ya to działało idealnie. O wiele prostsze, niż myślałem ... – Matthew

+6

Po prostu chcę dodać, że musi on zostać wywołany na obiekcie jQuery. Na przykład, jeśli zrobisz coś takiego '$ ('. A'). Change (function {this.submit()})' to nie zadziała. Musisz owijać 'this' w obiekt jQuery, jak' $ (this) '. Wtedy możesz nazwać to sumbitem. –

+2

Ostrzeżenie: Formularz NIE zostanie przesłany zdalnie (przez ajax). Zamiast tego nastąpi pełne odświeżenie. – Fred

1

Co powiecie na przekazanie jsona z kontrolera i przechwycenie go przez js.

Teraz działania kontrolera jako

respond_to do |format| 
     if some condition 
     format.json { render :json => {:success => true} } 
     format.html{ redirect_to some_path, :notice => "successfully created" } 
     else 
     ... 
     end 
end 

A uchwycenie json w JS jako

$('#my-form').bind 'ajax:success', (event,data) -> 
    if(data.success == true) 
    ... 

Nie dokładnie to, czego szukasz, ale nadzieję, że ten okazuje się być żadną pomocą.

+1

Wierzę, że on po prostu pyta, jak przesłać sam formularz. – andrewpthorp

+0

, jeśli formularz nie zostanie przesłany zdalnie do "some_path" zgodnie z opisem. – Abhaya

46

To jest po prostu w Rails sposób:

$("#myform").trigger('submit.rails'); 
+2

To jest prawdziwa odpowiedź. Zachowuje zachowanie przesłania ajaxa w zdalnym formularzu. Dzięki ! – Fred

+0

serdecznie zapraszamy! –

+1

Pamiętaj o Ismaelu: Musisz zawinąć formularz w obiekcie jQuery, aby przesłać go dalej. Więc nie 'myForm.submit()', ale '$ (myForm) .submit()'. Nie zauważyłem tego problemu od jakiegoś czasu ... – NobodysNightmare

18

W Rails 5.1+, który zastępuje starą jquery-ujs z non-jquery rails-ujs, powyższe odpowiedzi nie dłuższej pracy, zawsze wysłaniu formularza HTML za pośrednictwem HTTP żądanie. W ten sposób można wywołać nowe szyny złożyć obsługi zdarzenia:

var elem = document.getElementById('myform') // or $('#myform')[0] with jQuery 
Rails.fire(elem, 'submit'); 

(nie mogę powiedzieć, jak długo zajęło mi, aby dowiedzieć się, że jeden ...) Z jakiegoś powodu, regularne zdarzenia nie bubble odpowiednio do delegowanego programu obsługi zdarzeń attached by rails przy użyciu nowej szyny delegate function, po uruchomieniu przez jQuery.

+4

THX! To by zajęło mi na zawsze zrozumienie ... – ErwinM

Powiązane problemy