2016-07-28 186 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。我很困惑... –