2013-09-24 4 views
0

В контроллере ответ на запрос AJAX заключается в следующем:Rails AJAX (JSON) ответ перезагружает страницу

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

JS, который обрабатывает AJAX является:

$('#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»?

+0

Попробуйте использовать dataType: "json" вместо "JSON" – techvineet

+0

Действительно ли вы вызываете запрос ajax? – apneadiving

+0

Вы, по крайней мере, получаете первые два консольных сообщения перед вызовом $ .ajax? Основываясь на вашем журнале rails, идет ли контроллер и действия, которые вы ожидаете? Вы проверили заголовки запроса и ответа с помощью чего-то вроде Firebug и сравнили их с заголовками, используемыми при работе с запросами AJAX? – sockmonk

ответ

0

Вам нужно предотвратить действие отправки формы по умолчанию?

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

    //... 
}); 
0

У меня была эта проблема. Оказывается, я просто забыл добавить «// = require jquery_ujs» в файл application.js. Как только я добавил, все сработало нормально.

1

Итак, у меня была почти такая же проблема. В моем случае, я использовал folliwing ссылку, чтобы отправить запрос:

<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> 

My 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'); 
     } 
     }); 
    }) 
    }); 

и мои действия рельсов контроллера было:

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() необходим, потому что рельсы компонентов (рельсы-UJS я думаю) послал запрос в другом месте. Вы также можете удалить method: :post и будете работать нормально.

Надеюсь, я помог!

Смежные вопросы