Rails Попытка отправить форму об изменении выпадающего - PullRequest
16 голосов
/ 05 августа 2011

У меня работает мой Ajax, встроенный в Rails javascript, с кнопкой отправки. Тем не менее, я хотел бы представить, когда я изменяю значение выпадающего списка и удаляю кнопку. В своем исследовании я нашел то, что выглядит как правильное решение, но я не получил запрос к серверу. Вот мой код выпадающего списка, обратите внимание, что он все еще имеет кнопку отправки, которая работала до того, как я добавил: onchange:

<% form_tag('switch_car', :method => :put, :remote => true) do %>
  <div class="field">
    <label>Car Name:</label>
    <%= select_tag(:id, options_from_collection_for_select(active_cars, "id", "name"), 
       :onchange => ("$('switch_car').submit()"))%><%= submit_tag "Switch Car" %>
  </div>    
<% end %>

Вот сгенерированный HTML-код:

<form accept-charset="UTF-8" action="switch_car" data-remote="true" method="post">
  <div style="margin:0;padding:0;display:inline">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="_method" type="hidden" value="put" />
    <input name="authenticity_token" type="hidden" value="PEbdqAoiik37lcoP4+v+dakpYxdpMkSm7Ub8eZpdF9I=" />
  </div>
  <div class="field"> 
    <label>Car Name:</label> 
    <select id="id" name="id" onchange="$('switch_car').submit()">
      <option value="9">Truck</option>
      <option value="10">Car</option>
    </select>
    <input name="commit" type="submit" value="Switch Car" /> 
</div> 

Заранее спасибо за любую помощь.

Ответы [ 8 ]

20 голосов
/ 19 июня 2014

Замените ваш обмен на этот,

onchange: "this.form.submit();"
9 голосов
/ 04 апреля 2018

this.form.submit() не будет работать, если форма remote: true и rails-ujs используется. В этом случае вместо XHR будет происходить регулярная отправка.

Вместо этого вы должны:

onchange: 'Rails.fire(this.form, "submit")'

Вы можете прочитать здесь для более подробной информации.

6 голосов
/ 08 августа 2011

Это то, что я смог сделать, чтобы заставить его работать. Я назвал форму switch_car используя: name => "switch_car" и использовал следующий javascript.

:onchange => ("javascript: document.switch_car.submit();")

Я все еще ищу лучший ответ, поэтому буду обновляться, если найду что-то. По какой-то причине он не использует submit .js. Он обрабатывает его как HTML, в отличие от кнопки отправки, которая использует AJAX для обновления только изменяющихся элементов страницы. Но это лучшее, что мне удалось найти.

5 голосов
/ 05 августа 2011

В зависимости от используемой вами библиотеки js:

Прототип: :onchange => ("$('switch_car').submit()")

JQuery: :onchange => ("$('#switch_car').submit()")

Если вы используете значения по умолчанию и ваша версия rails ниже 3.1, то прототип является библиотекой по умолчанию.

2 голосов
/ 25 февраля 2015

Кажется, это уже давно, но я все равно опубликую свои выводы, поскольку нигде не нашел объяснения.

Я натолкнулся на эту статью , в которой довольно хорошо описывается, в чем заключается проблема при запуске ajax-запроса с помощью метода submit() (с jQuery или Handler или без него). Затем автор рекомендует сформировать собственный запрос AJAX. Это не обязательно и не должно быть сделано для использования логики в rails.js (гем jquery-jus).

Проблемы с запуском submit() возникают вручную, поскольку rails.js связывает и прослушивает событие с пространством имен submit.rails. Для ручного запуска отправки используйте

   onchange: 'javascript: $( this ).trigger("submit.rails")'

на элемент или форму.

2 голосов
/ 20 сентября 2012

Более общее решение с использованием jQuery (мне не нужно знать имя формы):

onchange: "$(this).parent('form').submit();"
1 голос
/ 30 сентября 2014

Для тега select, просто добавьте:

{:onchange => "myHandler();" }

где ваш обработчик будет:

this.form.submit();

Также, если onchange не работает, вы можете попробоватьChage с большой буквы C.

Наконец, убедитесь, что НЕ ЗАБИРАЛИ тег select_tag с выбором формы.

См. Мой ответ на аналогичный вопрос, только относительно формы выберите

Добавление события обмена в форму Выберите

0 голосов
/ 04 июля 2019

Если вы хотите узнать, как ajax отправляет информацию об изменениях полей, вот код.

<%= select_tag(:id, options_from_collection_for_select(active_cars, "id", "name"), 
data: { remote: true, url: your_ajax_route_path }%><%= submit_tag "Switch Car" %>

данные: {remote: true, url: your_ajax_route_path}

автоматически отправит ваш вклад в your_ajax_route_path. Если вы используете конструктор форм, вы должны использовать с input_html

input_html: { data: { remote: true, url: your_ajax_route_path } }

как это. Я надеюсь, что это будет полезно для вас

...