2017-01-24 11 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>', 
] 

私はあなたが動作しませんurlRulescomponents > urlManager > rulesにそうでない場合は、URLのルールを渡していると仮定しています。
冗長なルールを削除しました。一般的に、一般的なルールと最後に特定のルールを追加します。

+0

ありがとうございますが、これで問題は解決しません。この問題は、ラクダの行動の命名によるものであった。 – Mohammad

+0

実際にはありません。 'GetOne'アクション名は' get-one'としてルーティングされますが、 '\ w +'の代わりに '[\ w - ] +')正しい正規表現パターンを見落としてしまいます。私はそれを修正し、他のものも修正しました。 – Bizley

関連する問題