2015-11-01 1 views
1

Я посылаю $.ajax()редактировать/обновить запрос для редактирования записей группы, которая должна отображать данные в формате JSON (render :json, @data.to_json) Я только получаю объект XOR на проверяя Ajax успех.Rails4: Ajax.Request (редактировать) не возвращающие данные

Данные правильно настроены на сервере, но в функции обратного вызова успеха указано как неопределенное.

Это довольно странно, поскольку я полностью дублировал один и тот же код для создания/создания, и он работает нормально.

Вот редактирование/изменение код:

 =============================== HTML ==================================== 
     <!DOCTYPE html> 
     <html lang="en"> 
     <head> 
      ... 
     </head> 
     <body class="<%= controller_name -%> <%= action_name -%>"> 
      .... 
      <!-- BEGIN PAGE CONTENT --> 
      <div id="page-content"> 
       <div id='wrap'> 

        <div id= "groupRole-tableTools" class="options"> 
          <div id="groupRole-addTool" class="btn-group visible"> 
          <button type="button" class="btn dropdown-toggle" data-toggle="dropdown">...</button> 
          <ul class="dropdown-menu" role="menu"> 
           <li><a id="group-addTool" href="/groups/new">Add a group</a></li> 
           ... 
          </ul> 
         </div> 
        </div> 

        <div id="groupRole-lineTools" class="options hidden"> 
         ...    
         <a data-toggle="modal" data-accessible-id="#" id="groupRole-editTool" href="#groupRoleModal">...</a>      
         ... 
        </div> 

        <div class="panel-body collapse in"> 
         <table class="table table-striped table-bordered datatables" id="groups">...</table> 
        </div> 

        <div class="modal fade" id="groupModal" tabindex="-1" access_level="dialog" aria-labelledby="groupModalLabel" aria-hidden="true"> 
         <div class="modal-dialog"> 
          <div class="modal-content"></div> 
         </div> 
        </div> 

       </div> <!--wrap --> 
      </div> <!-- page-content --> 
      <!-- END PAGE CONTENT --> 

      <script src="/assets/administration/groups.index.js></script>   
      <script src="/assets/administration/init.js></script> 

     </body> 
     </html> 

А вот это groups.index.js нагруженные страницы:

================= groups.index.js =================== 

     $(document).ready(function() { 
      console.log("groups.index.js"); 

      $.ajaxSetup({ cache: false }); 
      var ajaxUrl = "http://" + window.location.host + "/groups.json"; 

      $.ajax({ 
       "dataType": 'json', 
       "type": "GET", 
       "url": ajaxUrl, 
       "success": function (data) { 

        var table = $('#groups').DataTable({ 
         select: true, 
         data: data.rows, 
         columns: [...], 
         columnDefs: [...] 
         ... 
        }); 
        table 
         .on('select', function (e, dt, type, indexes) { 
          var rowData = table.rows(indexes).data().toArray(); 
          var companyId = rowData[0].company_id; 
          groupId = rowData[0].group_id; 
          var groupName = rowData[0].group_name; 
         // hide add tool 
          $("#groupRole-addTool").toggleClass("hidden", "visible"); 
         // show line tool 
          $("#groupRole-lineTools").toggleClass("hidden", "visible"); 
         // set line tools data in DOM 
          $("#groupRole-editTool").attr("data-accessible-id", accessibleId); 
          $("#groupRole-editTool").attr("data-accessible-url", accessibleUrl); 
         }) 
         .on('deselect', function (e, dt, type, indexes) { 
         // hide line tool 
          $("#groupRole-lineTools").toggleClass("hidden", "visible"); 
         // show add tool 
          $("#groupRole-addTool").toggleClass("hidden", "visible"); 
         }); 

        // Handle EDIT GROUP tool click event 
        $('#groupRole-editTool').on('click', function(e) { 
         var itemId = $(this).data('accessible-id'); 
         var ajaxUrl = "http://" + window.location.host + accessibleUrl + itemId + "/edit"; 
         e.preventDefault(); 
         e.stopPropagation(); 
         // get EDIT FORM in modal content 
         $.ajax({ 
         "dataType": 'html', 
         "type": "GET", 
         "url": ajaxUrl, 
         "success": function (code_html, _status) { 
          $('#groupModal').modal('show'); 
          $("#groupModal div.modal-content").html(code_html); 
          $("#edit_group").on("ajax:success", function(xhr, data, _status){ 
          console.log("data: "+JSON.stringify(data, null, 2)); # data undefined !!!! 
          if (data["error"]) { 
           // errors back from server 
           $("#modalGroupAlert").removeClass('alert-info'); 
           $("#modalGroupAlert").addClass('alert-danger'); 
           $("#modalGroupAlert span").replaceWith(data["html"]); 
           $("#modalGroupAlert").toggleClass("hidden", "visible"); 
          } else { 
           // no errors 
           table.row.data(data["row"]).draw(); 
           $('#groupModal').modal('hide'); 
          } 
          }); 
         } 
         }); 
        }); 

        // Handle ADD GROUP tool click event 
        $('#groupRole-addTool').on('click', function(e) { 
         var ajaxUrl = "http://" + window.location.host + "/groups/new"; 
         e.preventDefault(); 
         e.stopPropagation(); 
         // get NEW FORM in modal content 
         $.ajax({ 
         "dataType": 'html', 
         "type": "GET", 
         "url": ajaxUrl, 
         "success": function (code_html, _status) { 
          $('#groupModal').modal('show'); 
          $("#groupModal div.modal-content").html(code_html); 
          $("#new_group").on("ajax:success", function(xhr, data, _status){ 
          console.log("data: "+JSON.stringify(data, null, 2));  # data defined !!!! 
          if (data["error"]) { 
           // errors back from server 
           $("#modalGroupAlert").removeClass('alert-info'); 
           $("#modalGroupAlert").addClass('alert-danger'); 
           $("#modalGroupAlert span").replaceWith(data["html"]); 
           $("#modalGroupAlert").toggleClass("hidden", "visible"); 
          } else { 
           // no errors 
           table.row.add(data["row"]).draw(); 
           $('#groupModal').modal('hide'); 
          } 
          }); 
         } 
         }); 
        }); 

       } 

Что меня беспокоит то, что ADD GROUP инструмент щелчок событие правильно обрабатывает Ajax запрос заполнить modal с html, а затем правильно запросить json-данные после создания.

, но с аналогичным кодом, Ajax edit request, также заполняет модель формой html, но после обновления данные не определены. Обновление в порядке, данные сына правильно настроены, запрос Ajax также успешный, но никаких данных нет. Только объект xor.

UPDATE 1 =========

Я обновил Аякс: параметры успеха (они были неправы) в

$("#edit_group").on("ajax:success", function(e, data, _status, xor){..} 

и проверил объект XOR ... код возврата равен 204, что означает NO CONTENT. Почему обновление Rails 4 PATCH отвечает 204?

xhr: { 
    "readyState": 4, 
    "responseText": "", 
    "status": 204, 
    "statusText": "No Content" 
} 
+0

Интересно, не связано ли это с методом формы редактирования ... Я проверю его, указав метод: PUT – erwin

ответ

0

нашел ответ: это нормальное поведение с обновлением, клиент не должен получить что-нибудь еще, что статус 204. Однако, я могу обойти это, написав:

render(json: @data.to_json , status: 200) 

который заставляет статус быть 200, а данные сынов отправляются обратно

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