2016-07-28 106 views
0

我有一個模式,更新有關國家的信息。Laravel修補程序AJAX

// Partial code of the modal 
<div id="EditModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times; </button> 
       <h4 class="modal-title" id="myModalLabel">Edit <label id="EntityType"></label></h4> 
      </div> 

      <div class="modal-body"> 
       <div class="row"> 
        @yield('EditModalBody') 
       </div> 
      </div> 
      <div class="modal-footer" style="text-align: center"> 
       {{ Form::submit('Save', ['class' => 'btn btn-success', 'id' => 'editBtn']) }} 
       <button type="button" class="btn btn-danger" data-dismiss="modal">Cancel</button> 
       {!! Form::close() !!} 
      </div> 
     </div> 
    </div> 
</div> 

我想用AJAX來實現這一點,所以,如果有任何錯誤,模態不會關閉和每個輸入字段下傳遞消息的錯誤出現。

這是我的JS:

<script type="text/javascript"> 
$("#EditModal").submit(function (e) { 

    e.preventDefault(); 

    var selector = $(this); 

    $.ajax({ 
     type: 'PATCH', 
     dataType: 'json', 
     url: selector.attr("action"), 
     data: selector.serialize(), 

     success: function (data) { 
      if (data.success) { 
       alert('go go go'); 
      } else { 
       // for debugging 
       alert('data'); 

      } 
     }, 
     error: function (xhr, textStatus, thrownError) { 
      alert(xhr.status); 
      alert(thrownError); 
     } 
    }); 
}); 

我得到 「405不允許的方法」 的錯誤,雖然我宣佈我的控制器作爲 「的ressource」 是這樣的:

Route::resource('country', 'CountryController', 
      ['except' => ['show']]); 

如果我做php artisan route:list我可以看到PATCH路由被聲明。

任何想法?

編輯1:

這是(部分)我的控制器:

public function update($id, Request $request) 
    { 
     $validator = Validator::make($request->all(), $this->getRules(), $this->getMesssages()); 

     if ($validator->fails()) { 
      $json = new stdClass(); 
      $json->success = false; 
      $json->errors = $Validator->errors(); 
     } 
     else { 
      $json = new stdClass(); 
      $json->success = true; 
     } 

     return Response::json($json); 

編輯2:

所以我在我的模式加入這個<input type="hidden" name="_token" value="{{{ csrf_token() }}}"/>,我不再得到405錯誤。我仍然有一個問題,我總是得到我的JS的「錯誤」部分(只有現在我得到狀態0)

+0

你可以告訴selector.attr(「action」)是怎麼樣的。 –

+0

它應該看起來像/ country/idOrSomething –

+0

正確。它是'國家/ id' –

回答

0

type: 'PATCH'在HTTP方法不存在,因此不會被Laravel識別。
試試這個:

$.ajax({ 
    type: 'POST', 
    dataType: 'json', 
    url: selector.attr("action"), 
    data: { 
     '_method': 'PATCH', 
     'data': selector.serialize(), 
    }, 

你必須提交方法PATCH作爲_method後的數據。

編輯
你的控制器功能看起來是錯誤的。正確的順序是

public function update(Request $request, $id) 

,而不是

public function update($id, Request $request) 

OT:我已經遞交了另外的Laravel文件,讓你一個關於這個問題的暗示,但它與無可奉告拒絕。

+0

看起來不錯!但我仍然得到「405方法...」 –

+0

您確定您使用正確的路線/ URL嗎? 'post'數據'_method = PATCH'的'post'請求應該被'update'路由接受。 - 請參閱https://laravel.com/docs/5.2/controllers#restful-resource-controllers – Kovah

+0

如果在控制器中執行'dd($ request);',我可以看到該方法正確執行爲PATCH。我很困惑... –