2017-06-27 6 views
0

Ich habe es geschafft, x-editierbare (https://vitalets.github.io/x-editable/) zu arbeiten mit einer Seite, insofern wenn ich auf ein Feld klicke, es inline und I anzeigt kann es bearbeiten, und ich kann erfolgreich an einen POST-URI übergeben.Wie validiere ich X-editierbare Anfrage in Laravel (Server-Seite)

Die Idee dabei ist, dass ich drei Schlüssel-Wert-Paare bin das Senden:

array:3 [▼ 
    "name" => "name" 
    "value" => "mathematics" 
    "pk" => "1" 
] 

und meine update() Methode fängt das Array, und aktualisiert sie erfolgreich den Datensatz in der Datenbank. Aber ich versage die Daten zu validieren. Diese

ist, wie mein Controller aussieht:

public function update(Request $request) 
{ 
    // 
    $id = $request->pk; 
    $subject = Subject::findOrFail($id); 

    $rules = array (
     'name' => 'bail|required|max:20|unique:subjects,name,'.$id 
    ); 

Dieser Pass Validierung leicht, auch wenn ich versuche, es zu scheitern

$validator = Validator::make ($request->all(), $rules); 

    if ($validator->fails()) { 
     return response()->json (array (

     'errors' => $validator->getMessageBag()->toArray() 
     )); 
    } else { 
     $subject->update([$request->name => $request->value]); 
    } 
    return response()->json ($subject); 
} 

So ist es, als ob ich vorbei irgendwie nicht die " Korrekt "Objekt zur Validierung anfordern()? Es gibt keine Formularübergabe, aber the documentation gibt eindeutig an:

Laravel generiert eine JSON-Antwort, die alle Überprüfungsfehler enthält. Diese JSON-Antwort wird mit einem HTTP-Statuscode 422 gesendet. 1

Route:

Route::post('/subjects/update/', '[email protected]'); 

Skript:

$('#subjects').editable({ 
    container:'body', 
    selector:'td.name', 
    type:'post', 
    dataType:'JSON', 
    validate:function(value){ 
     if ($.trim(value) === '') { 
      return "Field is required"; 
     } 
    } 
}); 

https://laravel.com/docs/5.4/validation#quick-ajax-requests-and-validation

+0

Ich habe ein kleines bisschen Mühe, Ihre Frage zu verstehen. Deine Werte werden korrekt gesendet? Aber die Validierung wird nicht "richtig" ausgeführt? Ist es die maximale Länge? Die Subjektbeziehung? – Henry

+0

Womit versuchst du es zu versäumen? – Henry

+0

@Henry das 'name'-Feld ist eindeutig und wenn ich versuchte, einen Namen einzufügen, der bereits existiert, passiert die Validierung kann Ursache und Interner Fehler. Normalerweise, wenn ich ajax-Anfrage ohne x-editable sende und versuche, diese Validierung zu scheitern, gebe ich die Fehlermeldung durch json zurück, die ich fange und es dem Benutzer zeige. –

Antwort

2

Wenn ich mich nicht irre, name ist das zu bearbeitende Feld (die DB-Spalte) und value ist, nun, der Wert. Es sieht so aus, als ob Sie die Spalte name aktualisieren, daher müssen Sie die Eindeutigkeit der value in der Anfrage validieren, nicht den "Namen".

Auch würde ich vorschlagen, dass Sie die validate Methode des Controllers verwenden (vom ValidatesRequests Merkmale zur Verfügung gestellt):

public function update(Request $request) 
{ 
    $id = $request->pk; 
    $subject = Subject::findOrFail($id); 

    $this->validate($request, [ 
     'name' => 'required', // this should be the column to update 
     'value' => 'bail|required|max:20|unique:subjects,name,'.$id 
    ];   

    $subject->update([$request->name => $request->value]); 

    return $subject; 
} 

Hier validate wird ablehnen automatisch mit einem 422-Code und dem Validierungsfehler in der JSON-Antwort . Wenn es passiert, wird es mit dem Update fortfahren. (return $subject gibt auch eine JSON-Darstellung des Objekts in der Antwort zurück.)

+0

Wenn es zwei (2) Felder gibt, die vom Controller validiert werden sollen ('Name' und' ein anderes Feld'), besteht die einzige Option hier darin, eine bedingte Aussage zu den Regeln zu machen, oder? –

+0

@NathanSiafa Ja, Sie können auch die Validierungsregel 'required_if' verwenden, um die Werte eines anderen Feldes zu überprüfen. Die Felder sind jedoch immer "Name" und "Wert", nicht wahr? – alepeino

+0

@Lepeino vielen Dank. Du hast mich ein bisschen gekostet, aber es hat sich gelohnt. –