2015-04-17 70 views
1

我有一篇帖子的評論列表,我希望用戶能夠編輯他們的帖子,如果他們想。在列表中有一個編輯按鈕(如果帖子屬於登錄的用戶),並在點擊時發出ajax請求並返回視圖。該視圖包含編輯註釋的表單並預裝了註釋詳細信息。到目前爲止,一切運作良好。通過ajax發送Laravel 5補丁請求

現在這裏是我遇到一個不清楚的問題的部分。當我想提交表單,使用補丁請求時,出現錯誤500的結構是這樣的:

  • 用戶訪問/posts/{id}在該視圖中的所有意見中列出。

  • 當用戶點擊編輯按鈕 /posts/{id}/comments/{comment_id}/edit被調用時,與 表格視圖當用戶提交此表 Route::patch('/posts/{id}/comments/{comment_id}/edit', ['as' => 'posts.editComment', 'uses' => '[email protected]']是 觸發返回

  • 。在失敗。

在Chrome中使用網絡檢查器我可以單擊錯誤。在那裏它告訴我有一個令牌不匹配?我沒有修改任何標記,只是使用默認的表單。表單代碼如下:

{!! Form::model($comment, ['method' => 'PATCH', 'route' => ['posts.editComment', $comment->post_id, $comment->id], 'id' => 'editComment' . $comment->id]) !!} 
    <div class="comment-edit"> 
     {!! Form::textarea('comment', null, ['class' => 'form-control', 'style' => 'height: 80px;']) !!} 
    </div> 
    <div class="comment-edit-buttons text-right"> 
     {!! Form::button(trans('general.cancel'), ['class' => 'btn btn-default btn-sm cancelEditComment', 'data-postId' => $comment->post_id]) !!} 
     {!! Form::button(trans('general.edit'), ['class' => 'btn btn-primary btn-sm editComment', 'data-postId' => $comment->post_id, 'data-commentId' => $comment->id]) !!} 
    </div> 
{!! Form::close() !!} 

它轉換爲像瀏覽器:

<form method="POST" action="http://www.domain.com/posts/29/comments/12/edit" accept-charset="UTF-8" id="editComment12"> 
    <input name="_method" type="hidden" value="PATCH"> 
    <input name="_token" type="hidden" value="generated token value"> 
    <div class="comment-edit"> 
     <textarea class="form-control" style="height: 80px;" name="comment" cols="50" rows="10">nieuwe comment</textarea> 
    </div> 
    <div class="comment-edit-buttons text-right"> 
     <button class="btn btn-default btn-sm cancelEditComment" data-postId="29" type="button">Annuleren</button> 
     <button class="btn btn-primary btn-sm editComment" data-postId="29" data-commentId="12" type="button">Bewerken</button> 
    </div> 
</form> 

我真的不知道在哪裏看?有沒有特別的方法使用Ajax發送PATCH請求?

+1

我在Laracasts上找到了這個討論,向下滾動到Lukas帖子,他討論了一個未加密的令牌問題,這是您可能遇到的問題。 https://laracasts.com/discuss/channels/general-discussion/csrf-form-token-doesnt-match-session-token – Azeame

+0

謝謝,我馬上去看看,讓你知道它是否有幫助。 – Ben

+0

我認爲你的鏈接有助於進一步得到。但現在我得到了405 - 方法不允許。雖然路線已定義且控制器方法存在..? – Ben

回答

1

您的問題與csfr_token的加密該怎麼辦,在刀片文件中添加以下內容:

$encrypter = app('Illuminate\Encryption\Encrypter'); 
$encrypted_token = $encrypter->encrypt(csrf_token()); 

然後將下面的字段添加到您的形式:

<input id="token" type="hidden" value="{{$encrypted_token}}"> 

,最後是請確保將原始csfr標記添加到標題中,如下所示:

<script> 
..... 
var $_token = $('#token').val(); 
.... 
$.ajax({ 
       type: 'post', 
       cache: false, 
       headers: { 'X-XSRF-TOKEN' : $_token }, 
       url: 'the_url_to_controller_thru_route/' + some_parameters_if_needed, 
       //contentType: "application/json; charset=utf-8", 
       //dataType: 'json', 
       data: {comment_id: 873}, //assuming that you send some data like id of a comment to controller 
           success: function(data) { 
.... 
</script> 

本,如果您notic如果有問題,請編輯我的答案,最好儘可能準確。

+0

這是正確的,除了我的ajax調用看起來不同。但如果稍後有人遇到同樣的問題,應該指出他們的解決方案:)乾杯! – Ben