2017-06-27 4 views
0

フィールドをクリックしたときにインラインで表示されている限り、x編集可能(https://vitalets.github.io/x-editable/)それを編集することができ、私は正常にPOST URIに提出することができます。laravelでX編集可能なリクエストを検証する方法(サーバー側)

ここでの考え方は、私が3キーと値のペアを送ってるということです:

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

と私のupdate()方法は、配列をキャッチし、それが成功したデータベースのレコードを更新します。しかし、私はデータの検証に失敗しています。

これは私のコントローラがどのように見えるかです:

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

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

この検証は私が

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

それを失敗しようとした場合でも、私は何とか "を渡していないよかのように、それはだ容易に通過します正しい "Requestオブジェクトを検証する()?フォーム提出はありませんが、the documentationには次のように明確に記載されています:

Laravelはすべての検証エラーを含むJSON応答を生成します。このJSONレスポンスは、422 HTTPステータスコードとともに送信されます。 1

経路:

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

スクリプト:

$('#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

質問を理解するのに少し問題があります。あなたの値は正しく送信されていますか?しかし、検証は「正しく」実行されていませんか?それは最大の長さですか?主題関係は? – Henry

+0

あなたは "それを失敗しようとしています"とは何ですか? – Henry

+0

@Henry 'name'フィールドは一意です。すでに存在する名前を挿入しようとすると、検証に失敗し、内部エラーが発生する可能性があります。通常、x-editableを使わずにajaxリクエストを送信し、その検証に失敗すると、jsonを通してエラーメッセージが返されます。これを捕捉してユーザに表示します。 –

答えて

2

私が間違っていない場合、nameは編集するフィールド(DB列)で、valueは値です。 name列を更新しているように見えるので、 "name"ではなく、要求内のvalueの一意性を検証する必要があります。

また、私はあなたが(ValidatesRequests特性によって提供された)あなたのコントローラのvalidate方法を使用することをお勧めしたい:ここ

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; 
} 

validateは422コードとJSON応答の検証エラーを自動的に拒否します。合格した場合は、アップデートを続行します。 (return $subjectは応答内のオブジェクトのJSON表現も返します)

+0

コントローラーによって検証されるフィールドが2つある場合( 'name'と' anotherフィールド ')、ここで唯一のオプションはルールの右側に条件ステートメントを実行することですか? –

+0

@ NathanSiafaはい、 'required_if'検証ルールを使って別のフィールドの値をチェックすることもできます。しかし、フィールドは常に 'name'と' value'ですが、そうではありませんか? – alepeino

+0

@lepeinoありがとうございました。あなたは私に少しコストがかかりましたが、それは価値がありました。 –

関連する問題