℡Wang Yan 2016-07-28 09:36 采纳率: 100%
浏览 2

Laravel补丁AJAX

I have a modal that updates information on countries.

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

I'm trying to implement this with AJAX, so that if there are any errors, the modal does not close and the error messaged appear under each input field.

This is my 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);
        }
    });
});

I am getting "405 Method not allowed" error, although I declared my controller as a "ressource" like this:

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

If I do php artisan route:list I can see that the PATCH route is declared.

Any ideas?

EDIT 1:

This is (part of) my controller:

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

EDIT 2:

So I added this <input type="hidden" name="_token" value="{{{ csrf_token() }}}"/> in my modal and I no longer get the 405 error. I still have a problem that I always get the "error" part of my JS (only that now I get status 0)

  • 写回答

1条回答 默认 最新

  • weixin_33724059 2016-07-28 10:11
    关注

    type: 'PATCH' does not exists on HTTP methods thus will not be recognized by Laravel.
    Try this:

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

    You have to submit the method PATCH as _method Post data.

    Edit
    Your controller function looks wrong. The correct order would be

    public function update(Request $request, $id)
    

    instead of

    public function update($id, Request $request)
    

    OT: I already submitted an addition for the Laravel documentation that gives you a hint about this problem but it was rejected with no comment.

    评论

报告相同问题?