2016-05-27 23 views
0

データをコントローラのメソッドに非同期で送信しようとしました。私はそれが些細な挑戦だと思っていますが、答えは答えられませんでした。 "必要なパラメータを指定していない"ajax経由でコントローラのメソッドでデータを取得するには?

public function actionRaiting(string $idUser, string $idBook, int $number) 
{ 
    $model = new Raiting(); 
    $model->idBook = $idBook; 
    $model->idUser = $idUser; 
    $model->number = $number; 
    if (\Yii::$app->request->isAjax) 
    { 
     if ($model->load(\Yii::$app->request->post())) 
     $model->save(); 
    } 
} 

スクリプト

$('.rating-input i').click(function() 
{ 
    $.ajax(
    { 
     url: 'raiting', 
     type: "POST", 
     contentType: 'application/json', 
     data: { 
       idUser: $('[name=idUser]').val(), 
       idBook: $('[name=idBook]').val(), 
       number: $(this).data("value") , 
      }, 
     dataType : 'json' 
    }); 
}); 

が、私は400エラーを取得する
コントローラー: はここに私のコードです。 どうすればいいですか?どうもありがとう!

public function actionRaiting() 
{ 
    $model = new Raiting(); 
    $model->idBook = $_POST['idBook']; 
    $model->idUser = $_POST['idUser']; 
    $model->number = $_POST['number']; 
    // ... 
} 

そして、あなたは、例えば、あなたのリクエストパラメータにCSRFトークンを追加する必要があります

+1

'type:" GET "' – GAMITG

答えて

0

あなたのメソッドは、値がGETのパラメータであると想定しています。あなたはPOST本文にそれらを渡しています。通常、私はURLにパラメータを追加することをお勧めします。

しかし、データをデータベースに保存することは、POSTで行う必要があるため、関数からパラメータを削除することをお勧めします。保存する前に、検証を行う必要があります。

public function actionRaiting() { 
    ... 
} 
+0

ありがとう、タイプをGETに変更しました。 –

+1

これにはGETを使用しないでください... – soju

+0

@sojuなぜですか?私は信じていますが、本当にリクエストの方法を選択すると混乱します。 –

1

あなたは、単に試してみてください:

var csrfParam = $('meta[name="csrf-param"]').attr('content'), 
    csrfToken = $('meta[name="csrf-token"]').attr('content'); 

そして:

  • Action Parameters
  • CSRF

    data: { 
        csrfParam : csrfToken, 
        // ... 
    } 
    

    は、詳細についてはこちらをご覧ください。

+0

私はそれについて試して読みましたが、それに対処できませんでした。タイプを 'get'に変更すると私を助けました! –

関連する問題