#はじめに
この前、ajaxを使用し、画面内でデータ更新を行う処理を作成しました。
その際、新規(CREATE)と更新(UPDATE)の処理は動くのに削除(DELETE)の処理だけなかなか動かずに時間を取られてしまったので備忘録です。
#結論
結論から先に言います。
新規や更新処理の時にエラーチェックで使用していたRequestの判定を削除処理でも使いまわした結果、削除処理では使用していなかった引数のチェック処理が勝手に走っていたため、インスタンスエラーが起きていました。
原因をいろいろ探しまわった時に、DELETE処理はajaxのPOSTでは飛ばないというような記述があり、データの飛ばし方に拘っていた結果、気づくのが遅れた初歩的なミスでした。
ちなみに返ってきていたエラーは422エラーでした。
動き自体は正しいのですが、Request処理が内部的に処理できなかったためこのエラーが返ってきていたのかなあと思います。
#コード
新規・更新処理時に使っていたコードがこれです。
// 新規・更新
$.ajax({
url: "hogehoge/update",
type: "POST",
dataType: "json",
data:{
Id: document.getElementById('Id').value,
Nm: document.getElementById('Nm').value,
hoge: document.getElementById('hoge').value
}
}).done(function(result) {
// 成功時
// 完了メッセージ表示
var message = '更新が完了しました。';
console.log(message);
}).fail(function() {
// 失敗時
// エラーメッセージ表示
var message = 'エラーが発生しました。';
console.log(message);
});
Route::post('hogehoge/update', [HogehogeController::class, 'updateHogehoge']);
public function updateHogehoge(HogehogeRequest $request) {
DB::connection('db')->beginTransaction();
try {
$DATABASE= new DATABASE();
$DATABASE->fill([
'ID' => $request->ID,
'NAME' => $request->NAME,
'HOGEHOGE' => $request->HOGEHOGE,
]);
$DATABASE->save();
// コミット
DB::connection('db')->commit();
return true;
} catch (Exception $ex) {
// ロールバック
DB::connection('db')->rollback();
return false;
}
}
これらのコードは動きました。
削除処理時に使っていたコードがこれです。
// 削除
$.ajax({
url: "hogehoge/delete",
type: "POST",
dataType: "json",
data:{
Id: document.getElementById('Id').value
}
}).done(function(result) {
// 成功時
// 完了メッセージ表示
var message = '削除が完了しました。';
console.log(message);
}).fail(function() {
// 失敗時
// エラーメッセージ表示
var message = 'エラーが発生しました。';
console.log(message);
});
Route::post('hogehoge/delete', [HogehogeController::class, 'deleteHogehoge']);
public function deleteHogehoge(HogehogeRequest $request) {
// レコード削除
DATABASE::where('ID', '=', $request->Id)->delete();
// コミット
DB::connection('db')->commit();
}
これらのコードが422エラーを返していた訳ですね。
このコントローラーのプロシージャで受け取った際に、requestのエラーの判定をHogehogeRequestで行っていたのですが、削除の際、不要になって削っていたNmやHogehogeといった引数(?)の判定もHogehogeRequest内で行っていました。
~~ だって主キーだけで削除できるんだから他の渡しても意味ないじゃん……。~~
とどのつまり、このHogehogeRequestを指定せずに普通のRequestを指定すれば良かったわけですね。
直すとしたら……
public function deleteHogehoge(HogehogeRequest $request) {
ここを……
public function deleteHogehoge(Request $request) {
こんな感じ……?
#さいごに
結局のところ、凡ミスには気を付けようねってことですね。