In meiner Rails-App reiche ich eine Reihe von Formularen über AJAX ein - normalerweise über ein Modal. Um verwende ich zu tun so den folgenden Code:Wie binde ich eine Jquery-Submit an eine form_tag-Formular-Submission-Aktion in Rails
$(document).ready(function(){
$(form).on('submit', function(event) {
form = $(this).attr('id');
selector = $('form#' + form)
$(document).bind('ajaxError', selector, function(event, jqxhr, settings, exception){
// note: jqxhr.responseJSON undefined, parsing responseText instead
$(event.data).render_form_errors($.parseJSON(jqxhr.responseText));
});
});
Dies zieht alle Fehlermeldungen und führt sie durch die render_form_errors
Funktion, die dann die Fehler in einen Fehlerblock an der FORMULARPLZ.
Um den Code in einer attraktiveren Art, wie ich mit „form_tag“ Unterwerfung in Rails habe zu machen begonnen:
<%= form_tag('/sale_qualifiers', method: :post, remote: true) do -%>
<%= fields_for :sale_qualifier do |ff| %>
<%= ff.hidden_field :sales_opportunity_id, :value => @sales_opportunity.id %>
<%= ff.hidden_field :question_id, :value => @question.id %>
<tr id="form#sale_qualifier_submit">
<td><%= @question.question_text %></td>
<td>
<%= ff.fields_for :answer_attributes do |answer| %>
<div class="form-group">
<% if @question.answer_type == 'Text Field' %>
<%= answer.text_area :answer_text, :placeholder => "Enter your answer"%>
<% end %>
<% if @question.answer_type == 'Datetime' %>
<div class='input-group date' id='datetimepicker' data-date-format="YY.MM.DD">
<%= answer.text_field :answer_text, class: "form-control", data: { date_format: 'YYYY/MM/DD' }, :placeholder => "YYYY/MM/DD" %>
<span class="input-group-addon">
<span class="glyphicon glyphicon-calendar"></span>
</span>
</div>
<% end %>
<% if @question.answer_type == 'Boolean' %>
<%= answer.select :answer_text, [['Yes', true], ['No', false]] %>
<% end %>
<span class="warning-block"></span>
<span class="help-block"></span>
</div>
<% end %>
</td>
<td>
<%= submit_tag "Submit", class: "btn btn-large btn-success", id: "sale_qualifier_submit", data: { disable_with: "Submitting..." }, autocomplete: 'off' %>
</td>
</tr>
<% end %>
<% end %>
Das Ergebnis dieses Code ist, dass die submit_tag
nicht in der Form nicht sitzt in das erzeugte HTML - was es tut, wenn die form_for
Methode verwendet wird. Als solche meine Jquery bindet nicht an der Aktion vorzulegen, und der Code:
$(form).on('submit', function(event) {
form = $(this).attr('id');
selector = $('form#' + form)
funktioniert entweder nicht - weil die gesamte Form einen anderen Satz von IDs und Klassen hat, wenn form_tag verwenden und sie nicht passen organisch zusammen wie wenn Rails die gesamte Form produziert.
Kann irgendjemand eine Jquery-Methode vorschlagen, um die nächste Formulargruppe zur Übergabeschaltfläche beim Senden zu bringen, und dann diese Aktion an sie binden, wenn ein AjaxError vorliegt?
Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen, um zu helfen.
Sie verwenden "remote: true", sodass das Ereignis von ujs behandelt und verworfen wird. Sie können sich an andere Ereignisse binden: https://github.com/rails/jquery-ujs/wiki/ajax – Geoffroy
Danke Geoffroy. Ich verwende auch "remote: true" in der form_for-Version, und die beigefügte JQuery funktioniert so gut, da sie beim Senden an das Formular bindet. Was ich versuche zu verstehen, ist, wie man sich an den HTML-Code bindet, der beim Senden von form_tag generiert wird. – Zoinks10