2017-01-24 3 views
1

Я пытаюсь вызвать пользовательское действие ajax, но ответ возвращается 404, я уверен, что это проблема маршрутизации, но я не могу понять, как ее решить , вот мой код:Yii2: мое новое действие не найдено - 404

действия

public function actionGetOne($id){ 
    $model = Driver::findOne($id); 
    if(!empty($model)){ 
     $data = []; 
     $row = [ 
      'id'=>$model->id, 
      'full_name'=>$model->full_name, 
      'email'=>$model->email, 
      'nationality_id'=>$model->nationality_id, 
      'current_location'=>$model->current_location, 
      'medical_check_id'=>$model->medical_check_id, 
      'img'=>$model->img, 
      'current_fleet_id'=>$model->current_fleet_id, 
      'availability'=>$model->availability 
     ]; 
     $data[] = $row; 
     echo json_encode(['driver-getOne'=>'success','data'=>$data]); 
    } else{ 
     echo json_encode(['driver-getOne'=>'failure']); 
    } 
} 

Аякс

$.ajax({ 
    url:'<?= urldecode(Url::toRoute(['driver/get-one'])); ?>?id=<?= $id; ?>', 
    method:'post', 
    dataType:'json', 
    success:function(response){} 
    error:function(){ 
     alert('target action is not found!'); 
    } 
} 

бэкенд/конфигурация/params.php

<?php 
return [ 
    'adminEmail' => '[email protected]', 
    'urlRules' => [ 
     '' => 'site/index', 
     'login/' => 'site/login', 
     'signup/' => 'site/signup', 
     '<controller:[\w-]+>/<action:\w+>' => '<controller>/<action>', 
     '<controller:[\w-]+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', 
     '<controller:[\w-]+>/<id:\d+>' => '<controller>/view', 
     '<controller:[\w-]+>/create' => '<controller>/create', 
     '<controller:[\w-]+>/update/<id:\d+>' => '<controller>/update', 
     '<controller:[\w-]+>/delete/<id:\d+>' => '<controller>/delete', 
     '<controller:[\w-]+>/get-all' => '<controller>/get-all', 
     '<controller:[\w-]+>/get-one' => '<controller>/get-one', 
     '<controller:[\w-]+>/update-status' => '<controller>/update-status', 
    ] 
]; 

ответ

1

Изменить несколько вещей, и повторите попытку.

Действие:

public function actionGetOne($id) 
{ 
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
    $model = Driver::findOne($id); 
    if (empty($model)) { 
     return ['driver-getOne' => 'failure']; 
    } 
    return [ 
     'driver-getOne' => 'success', 
     'data' => [[ 
      'id' => $model->id, 
      'full_name' => $model->full_name, 
      'email' => $model->email, 
      'nationality_id' => $model->nationality_id, 
      'current_location' => $model->current_location, 
      'medical_check_id' => $model->medical_check_id, 
      'img' => $model->img, 
      'current_fleet_id' => $model->current_fleet_id, 
      'availability' => $model->availability 
     ]], 
    ]; 
} 

return Действие должно что-то, чтобы правильно закончить последовательность ответа иначе нежелательные вещи могут произойти. Установив формат ответа, вы можете автоматически получить кодированный массив JSON.

AJAX:

$.ajax({ 
    url:'<?= Url::to(['driver/get-one', 'id' => $id]) ?>', 
    method:'post', 
    dataType:'json', 
    success:function(response){} 
    error:function(){ 
     alert('target action is not found!'); 
    } 
} 

Получите ваш URL, используя правильный синтаксис.

Params:

'urlRules' => [ 
    '' => 'site/index', 
    'login' => 'site/login', 
    'signup' => 'site/signup', 
    '<controller:[\w-]+>/<id:\d+>' => '<controller>/view', 
    '<controller:[\w-]+>/<action:[\w-]+>/<id:\d+>' => '<controller>/<action>', 
    '<controller:[\w-]+>/<action:[\w-]+>' => '<controller>/<action>', 
] 

Я предполагаю, что вы передаете urlRules в components > urlManager > rules иначе URL правила не будут работать.
Я удалил избыточные правила. В общем, сначала добавьте общие правила и конкретные правила.

+0

Благодарим вас за усовершенствования, но это не решит мою проблему. Проблема заключалась в том, что имя верблюда было названо действием. – Mohammad

+0

Не совсем. Имя функции GetOne преобразуется в маршрутизацию как 'get-one', но вы пропустили правильный шаблон регулярного выражения (' [\ w -] + 'вместо' \ w + '), чтобы не было сопоставления маршрутизации. Я исправил это и исправил другие вещи, потому что я так хорош;) – Bizley