Rails AJAX(JSON)响应重新加载页面

时间:2013-09-24 12:53:53

标签: ruby-on-rails ajax web reload

在控制器中,对AJAX请求的响应如下:

@response = {resp: "ack"}
render json: @response

处理AJAX的JS是:

$('#some_btn').click(function() {    

    var valuesToSubmit = $('#some_form').serialize();
    var url = $('#some_form').attr('action');

    console.log("VALUE: " + valuesToSubmit);
    console.log("URL: " + search_url);

    $.ajax({
        type: 'POST',
        url: url, //sumbits it to the given url of the form
        data: valuesToSubmit,
        dataType: "JSON",
        success: function(data) {

            console.log("saved");
            console.log(data);

        }
    });

    return false;
});

但问题是我没有得到控制台消息,而是页面重新加载,我在新页面上将json作为文本。如何防止这种“非真实的AJAX”行为?

3 个答案:

答案 0 :(得分:1)

所以,我几乎有同样的问题。就我而言,我使用了以下链接发送请求:

<td>
  <%= link_to add_item_path(item), 
    class: 'ui icon button',
    id: "add-item-#{item.id}",
    method: :post do %>
      <%= fa_icon 'shopping-cart' %>
    <% end %>
 </td>

我发送ajax的js是:

  $(document).ready(function() {
    $("a:regex(id,add-item-[0-9]+)").click(function(event) {
      event.preventDefault();
      var link = $(this).attr("href");

      $.ajax({
        url: link,
        method: "POST",
        dataType: "json",
        success: function(data) {
          console.log(data);
          $('#notice-modal').modal('show');
        }
      });
    })
  });

我的rails控制器操作是:

  def add
    @item = Item.find(params[:item_id])
    current_cart << { item_id: @item.id, quantity: 1 }
    render json: {quantity: 1}
  end

所以问题是我只使用event.preventDefault()但是没有用过。为了正常工作,我需要使用event.stopPropagation()。像这样:

  $("a:regex(id,add-item-[0-9]+)").click(function(event) {
    event.preventDefault();
    event.stopPropagation();
    var link = $(this).attr("href");

    $.ajax({
      url: link,
      method: "GET",
      dataType: "json",
      success: function(data) {
        console.log(data);
        $('#notice-modal').modal('show');
      }
    });
  })

需要event.stopPropagation(),因为rails组件(我认为是rails-ujs)将请求发送到其他地方。您也可以删除method: :post,并且可以正常使用。

希望我帮忙!

答案 1 :(得分:0)

您是否需要阻止默认表单提交操作?

$('#some_btn').click(function(event) {  
  event.preventDefault();

  //...
});

答案 2 :(得分:0)

我自己有这个问题。事实证明,我只是忘了添加&#34; // = require jquery_ujs&#34;到我的application.js文件。一旦我添加它,一切正常。