В Ruby on Rails я пытаюсь обновить innerHTML
тега div с помощью помощника form_remote_tag
. Это обновление происходит всякий раз, когда связанный тег выбора получает событие onchange. Проблема в том, <select onchange="this.form.submit();">
; не работает Также не document.forms[0].submit()
. Единственный способ получить код onsubmit, сгенерированный в form_remote_tag, - это создать скрытую кнопку отправки и вызвать метод click для кнопки из тега select. Вот рабочий частичный пример ERb.
<% form_remote_tag :url => product_path, :update => 'content', :method => 'get' do -%>
<% content_tag :div, :id => 'content' do -%>
<%= select_tag :update, options_for_select([["foo", 1], ["bar", 2]]), :onchange => "this.form.commit.click" %>
<%= submit_tag 'submit_button', :style => "display: none" %>
<% end %>
<% end %>
Я хочу сделать что-то вроде этого, но это не сработает.
<% form_remote_tag :url => product_path, :update => 'content', :method => 'get' do -%>
<% content_tag :div, :id => 'content' do -%>
# the following line does not work
<%= select_tag :update, options_for_select([["foo", 1], ["bar", 2]]), :onchange => "this.form.onsubmit()" %>
<% end %>
<% end %>
Итак, есть ли способ удалить невидимую кнопку отправки для этого варианта использования?
Кажется, здесь какая-то путаница. Итак, позвольте мне объяснить. Основная проблема в том, что submit()
не вызывает код onsubmit()
, отображаемый в форме.
Фактическая HTML-форма, которую Rails отображает из этого ERb, выглядит следующим образом:
<form action="/products/1" method="post" onsubmit="new Ajax.Updater('content', '/products/1', {asynchronous:true, evalScripts:true, method:'get', parameters:Form.serialize(this)}); return false;">
<div style="margin:0;padding:0">
<input name="authenticity_token" type="hidden" value="4eacf78eb87e9262a0b631a8a6e417e9a5957cab" />
</div>
<div id="content">
<select id="update" name="update" onchange="this.form.commit.click">
<option value="1">foo</option>
<option value="2">bar</option>
</select>
<input name="commit" style="display: none" type="submit" value="submit_button" />
</div>
</form>
Я хочу укоротить невидимую кнопку отправки, но использование прямой формы. Отправка не работает. Итак, мне нужен какой-то способ вызова кода события отправки формы.
Обновление: решение Orion Edwards сработало бы, если бы Rails не генерировал return(false);
. Я не уверен, что хуже, посылая фантомный щелчок невидимой кнопке отправки или вызывая eval на вызове getAttribute('onsubmit')
после удаления обратного вызова с заменой строки javascript!