Проблема с маршрутом в Ajax с использованием Laravel? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь получить список стран с их городами, используя Select2 с Jquery.

Во время создания сообщения с соответствующей страной и городом у меня нет проблем, но вво время редактирования поста я пропускаю следующую ошибку:

http: //imperial.test/dashboard/posts/40/edit/getStates/6 (Not Found)

D: \laragon \ www \ Imperial \ vendor \ laravel \ framework \ src \ Illuminate \ Routing \ RouteCollection.php # 179

Маршруты:

Route::group([
'prefix' => 'dashboard', 
'namespace' => 'Admin', 
'middleware' => 'auth'], 
function(){

    Route::get('/', 'AdminController@index')->name('dashboard');
    Route::resource('posts', 'PostsController', [
        'names' => [
            'index' => 'dashboard.posts.index',
            'create' => 'dashboard.posts.create',
            'store' =>  'dashboard.posts.store',
            'edit'  =>  'dashboard.posts.edit',
            'update' => 'dashboard.posts.update',
            'destroy' => 'dashboard.posts.destroy',
        ],
    ]);

    Route::get('posts/create/getStates/{id}', 'PostsController@getStates');
    Route::get('posts/create/getCities/{id}', 'PostsController@getCities');

    Route::get('posts/edit/getStates/{id}', 'PostsController@getStates');
    Route::get('posts/edit/getCities/{id}', 'PostsController@getCities');

    Route::get('images/posts/{id}/avatar/{image}', [
        'uses' => 'PostsController@postProfileAvatar',
    ]);

});

Мой сценарий

$(document).ready(function(){
$('select[name="country_id"]').on('change',function(){

    var country_id = $(this).val();

    if(country_id)
    {
        $.ajax({

            url: '/edit/getStates/'+country_id,
            type: 'GET',
            dataType: 'json',
            success: function(data){
                console.log(data);

                $('select[name="state_id"]').empty();
                $.each(data, function(key, value){
                    $('select[name="state_id"]')
                                .append('<option value="'+key+'">' + value + '</option>');
                });
            }

        });
    } else {
        $('select[name="state_id"]').empty();
    }

});

$('select[name="state_id"]').on('change',function(){
    var state_id = $(this).val();
    if(state_id)
    {
        $.ajax({

            url: '/edit/getCities/'+state_id,
            type: 'GET',
            dataType: 'json',
            success: function(data){
                console.log(data);

                $('select[name="city_id"]').empty();
                $.each(data, function(key, value){
                    $('select[name="city_id"]').append('<option value="'+key+'">' + value + '</option>');
                })
            }

        });
    }else {
        $('select[name="city_id"]').empty();
    }
});

});

N 'в блейде, если путь к сценарию зарегистрирован:

<script src="{{ asset('js/worldedit.js') }}" defer></script>

Любые предложения о том, как решить эту ошибку, я попробовал ее в отдельном проекте, не используя Route :: group и префиксы, и я сделал это с маршрутами GET, и это сработало, поэтому я делаю вывод, что проблема в маршруте ajax

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

Когда вы просматриваете сообщение, ваш текущий адрес -

http: //imperial.test/dashboard/posts/40

, и у вашего javascript есть этот URL (относительный адрес)

url: '/edit/getStates/'+country_id,

Таким образом, вызов ajax фактически получает этот URL:

http: //imperial.test/dashboard/posts/40/edit/getStates/6

Пока вы определяете маршрут (в laravel web.php) для

  http: //imperial.test/dashboard/posts/edit/getStates/{id}

Таким образом, вы получаете не найденную ошибку.

Определите ваши маршруты как

Route::get('posts/{postid}/edit/getStates/{id}', 'PostsController@getStates');
Route::get('posts/{postid}/edit/getCities/{id}', 'PostsController@getCities');
0 голосов
/ 24 октября 2019

Вы должны использовать помощник по маршруту, чтобы получить маршрут по имени. В этом случае вы можете сделать следующее:

В элементе html "select":

Например, предположим, что у вас есть маршрут под названием "towns.list", который извлекает все города в этомсостояние:

<select name="state_id" data-route="{{ route('cities.list', ['id' => ':id']) }}" >

Итак, в скрипте js просто используйте этот маршрут следующим образом:

    ....
    var select_state = $('select[name="state_id"]'); // or $(this)     
    var route = select_state.data('route')
    route = route.replace(':id', select_state.val())

    $.ajax({

        url: route,
        type: 'GET',
        dataType: 'json',
    ....

Поняли ли вы идею?

0 голосов
/ 24 октября 2019

Ваш маршрут относится к группе с префиксом dashboard, поэтому он не должен быть

url: '/dashboard/posts/edit/getStates/'+ country_id

вместо

url: '/edit/getStates/'+country_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...