Отправка формы Rails с помощью jQuery и Ajax - PullRequest
4 голосов
/ 15 июля 2009

РЕДАКТИРОВАТЬ: понял, так что задать связанный вопрос.

вот мой Javascript

jQuery.ajaxSetup({
    'beforeSend': function(xhr) {
        xhr.setRequestHeader("Accept", "text/javascript")
    }
})

jQuery.fn.submitWithAjax = function() {
    this.submit(function() {
        $.post(this.action, $(this).serialize(), null, "script");
        return false;
    })
    return this;
};

    $('.error').hide();
$("#business_submit").click(function() {
    // validate and process form here

    $('.error').hide();
    var name = $("input#business_name").val();
    if (name == ""  || name == "Required Field") {
        $('#namelabel').show()
        $("#business_name").focus();
        return false;
    }
    var address = $("#business_address").val();
    if (address == ""  || address == "Required Field") {
        $('#addresslabel').show();
        $("#business_address").focus();
        return false;
    }
    var city = $("#business_city").val();
    if (city == "" || city == "Required Field") {
        $('#citylabel').show();
        $('#business_city').focus();
        return false;
    }
    var state = $("#business_state").val();
    if (state == ""  || state == "Required Field") {
        $('#statelabel').show();
        $("#business_state").focus();
        return false;
    }
    var zip = $("#business_zip").val();
    if (zip == ""  || zip == "Required Field") {
        $('#ziplabel').show();
        $("#business_zip").focus();
        return false;
    }
    var phone = $("#business_phone").val();
    if (phone == ""  || phone == "Required Field") {
        $('#phonelabel').show();
        $("#business_phone").focus();
        return false;
    }

    var category = $("#business_business_category_id").val();
    if (category == " - Choose one - ") {
        $('#categorylabel').show();
        $("#business_business_category_id").focus();
        return false;
    }


   $.ajax ({
        type: "POST",
        data: form.serialize()
    });
    return false;
})

.ajax код запускает мой файл create.js.erb, который содержит

$("#new_business").submitWithAjax();
$("#new_business")[0].reset();
$("#new_business").hide();

Вот таблица под формой.

<div id="unapproved">
  <table width="650" align="center" cellpadding="6" cellspacing="0">

    <tr>
      <td width="150"><a class="Contact<%=h @business.id %>" href="#"><%=h @business.name %></a></td>
      <td width="150"><%=h @business.address %></td>
      <td width="100"><%=h @business.business_category.name %></td>
      <td width="200"><%=h @business.description %></td>
      <td width="50"><%= link_to(image_tag('/images/accept.png', :alt => 'Approve'), :id =>@business.id, :action => 'approve') %>
        <a class="Edit<%=h @business.id %>" href="#"><img src="/images/pencil.png" alt="Edit" /></a>
      <%= link_to(image_tag('/images/bin.png', :alt => 'Remove'), @business, :confirm => 'Are you sure?', :method => :delete) %></td>
    </tr>
  </table>
</div>

Теперь моя единственная проблема в том, что таблица под моей формой не обновляется динамически. Он добавляет данные в базу данных, и все проверки отлично работает. Но я должен обновить страницу. Я пытался добавить что-то вроде

$("#unapproved").append("<%= escape_javascript(render(:file => 'business')) %>");

но это только ломает его.

Ответы [ 3 ]

1 голос
/ 16 июля 2009

Рабочая! Я просто попытался имитировать Railscast 136. Я бросил свой стол в файл с именем _unapproved.html.erb. В своем индексе я заменил таблицу на:

<div id="unapproved">
  <%= render :partial => "unapproved" %>
</div>

А потом в моем файле create.js.erb было:

$("#unapproved").append("<%= escape_javascript(render(:partial => "unapproved")) %>");

Игра окончена. GG!

1 голос
/ 16 июля 2009

Полагаю (поскольку ваша кнопка "отправить" отсутствует в приведенном выше HTML-коде, ваша кнопка "business_submit" - просто ввод, а не кнопка отправки.

Этот код:

jQuery.fn.submitWithAjax = function() {
    this.submit(function() {
        $.post(this.action, $(this).serialize(), null, "script");
        return false;
    })
    return this; };

не сообщает форму для отправки. Он говорит, что когда происходит «отправить», идите и делайте что-либо.используется для «Привязки функции к событию отправки каждого соответствующего элемента. Событие отправки срабатывает при отправке формы».

На самом деле вы никогда не отправляете форму. Я готов поспорить(не могу быть уверен, потому что у меня нет всего кода), то есть вы меняете метод submitWithAjax следующим образом:

jQuery.fn.submitWithAjax = function() {
    $.post(this.action, $(this).serialize(), null, "script");
    return false; };

он должен работать. По крайней мере, он ближе к тому, что вы пытаетесьделаем.

0 голосов
/ 16 июля 2009

.append просто добавляет эту буквальную строку в ваш #unapproved div?

.append хочет добавить визуализированный html, а не код ERB, который вы пытаетесь использовать. Что я делаю для такого рода вещей, так это использую функцию рендера в моем контроллере, чтобы вызов AJAX получал HTML-код, который был отрисован.

Например, в контроллере;

respond_to do |format|
  format.js { 
    render :partial => "menu", :layout => false and return
  }
end

А в виде;

$("a.show_menu").click(function() {
  var url = $(this).attr('href');
  $.ajax({
      beforeSend      : function(request) { request.setRequestHeader("Accept", "text/javascript"); },
                      /* Included so Rails responds via "format.js" */
      success         : function(response) { $("#menu").empty().append(response); },
      type            : 'GET',
      url                 : url
  });
  return false;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...