2016-05-27 5 views
0

Ich versuche asynchron Daten an Controller-Methode zu senden. Ich nehme an, das ist eine triviale Herausforderung, aber nicht die Antwort in SO. Hier ist mein Code:
-ControllerWie bekomme ich Daten in der Controller-Methode über 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(); 
    } 
} 

Script

$('.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' 
    }); 
}); 

erhalte ich die 400-Fehler "nicht die erforderlichen Parameter angegeben". Können Sie mir erklären, wie ich das machen soll? Danke vielmals!

+1

Verwenden Sie 'Typ:" GET "' – GAMITG

Antwort

0

Ihre Methode erwartet die Werte als GET Parameter. Sie übergeben sie im POST Körper. Normalerweise würde ich empfehlen, die Parameter an die URL anzuhängen.

Da Sie jedoch Daten in einer Datenbank speichern, was über POST erfolgen sollte, empfehle ich, die Parameter aus Ihrer Funktion zu entfernen. Vor dem Speichern sollte eine Überprüfung in Ihrem Modell durchgeführt werden.

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

Danke, ich habe den Typ in GET geändert und es hat geholfen! –

+1

Sie sollten nicht GET für dieses verwenden ... – soju

+0

@soju warum so? Ich glaube aber wirklich verwirrt durch die Wahl zwischen Request-Methoden. –

1

Sie sollten einfach versuchen:

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

Und Sie sollten csrf Token auf Ihre Anfrage params hinzufügen, zum Beispiel :

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

Und:

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

Lesen Sie mehr über:

+0

Ich versuchte und las darüber, aber konnte damit nicht umgehen. Das Ändern des Typs in "Get" hat mir geholfen! –

Verwandte Themen