отправить удаленную форму рельсы с Javascript - PullRequest
22 голосов
/ 20 декабря 2011

В моем приложении rails есть удаленная форма, например, такая:

<%= 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 %>

Теперь я хотел бы отправить эту форму через javascript и вызвать все обратные вызовы удаленных форм rails. Пока что я попробовал несколько вещей, но, похоже, ничего не работает.

Вещи, которые я пробовал:

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

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

но пока не повезло. Есть идеи?

Ответы [ 6 ]

63 голосов
/ 06 апреля 2013

Это просто в Rails:

 $("#myform").trigger('submit.rails');
58 голосов
/ 04 октября 2017

В Rails 5.1+, который заменяет старый jquery-ujs не-jquery rails-ujs, приведенные выше ответы больше не работают, всегда отправляя форму через HTML-запрос HTML. Вот как вы запускаете новый обработчик события отправки рельсов:

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

(Не могу сказать, сколько времени у меня ушло на то, чтобы выяснить это ...) По какой-то причине обычные события не всплывают должным образом в обработчик делегированных событий , присоединенный rails используя новую функцию делегата rails, когда они запускаются jQuery.

6 голосов
/ 23 апреля 2018

Как насчет использования rails_ujs и просто выполните следующее:

Rails.fire(form, 'submit');

(где form - элемент DOM)

Это похоже на правильный Rails способ сделать это.

Вы можете проверить источник здесь - https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/utils/event.coffee#L34

3 голосов
/ 20 декабря 2011

Вы можете просто использовать .submit ();

$("#my-form").submit();
2 голосов
/ 20 декабря 2011

Как насчет передачи json из контроллера и захвата его вашим js.

Теперь, действие контроллера как

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

И захват json в js как

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

Не совсем то, что вы ищете, но надеюсь, что это вам поможет.

1 голос
/ 22 марта 2018

@ mltsy ответ отлично подходит для меня.Тем не менее, хотел бы повторить, что это требует использования rails-ujs.Если вы обновили более старую версию, как я, вы все равно можете использовать jquery-зависимый jquery_ujs.Если вы получаете ReferenceError: Can't find variable: Rails в своей консоли, проверьте файл application.js и убедитесь, что у вас есть rails-ujs или отличный ответ @ mltsy не сработает.Я хотел оставить комментарий вместо ответа, но Стек не позволил мне.

...