我是编码新手,我一直在看这个youtube教程,内容是关于在laravel中处理服务器端和数据表的简单服务器,并得到了这个错误,我不知道为什么要得到它。
我正在尝试为我的代码创建一个更新函数,但无法发现此错误。我感觉这是因为我的更新网址,但是我在教程中使用了相同的语法,所以您可以请上帝帮忙。
缺少[路由:Clients.update] [URI: 客户/ {客户}]。 (视图: C:\ xampp \ htdocs \ project \ resources \ views \ clients \ clients.blade.php)
这是我的查看代码
<div id="formmodal" class="modal fade" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Client Form</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>{{-- header --}}
<div class="modal-body">
<span class="result" id="result"></span>
<form method="post" id="client_form" enctype="multipart/form-data">
@csrf
<div class="form-group">
<label for="client_name">Name</label>
<input type="text" class="form-control" name="client_name" id="client_name" placeholder="Enter Name">
</div>
<div class="form-group">
<label for="client_address">Addres</label>
<input type="text" class="form-control" name="client_address" id="client_address" placeholder="Enter Addres">
</div>
<div class="form-group">
<label for="client_date">Birth Date</label>
<input type="date" class="form-control" name="client_bdate" id="client_bdate">
</div>
<div class="modal-footer">
<input type="text" name="action" id="action">
<input type="text" name="hidden_id" id="hidden_id">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<input type="submit" class="btn btn-primary" name="savebtn" id="savebtn" value="Add">
</div>
</form>
</div>
</div>
</div>
</div>
$('#client_form').on('submit', function(event){
event.preventDefault();
var url;
if($('#action').val() == 'Add')
{
url = "{{ route('Clients.store') }}";
}else{
url = "{{ route('Clients.update') }}";
}
$.ajax({
url: url,
method: "POST",
data: new FormData(this),
contentType: false,
cache: false,
processData: false,
dataType: "json",
success:function(data)
{
var html = '';
if(data.errors)
{
html = '<diV class="alert alert-danger">';
for(var count = 0; count < data.errors.length; count++)
{
html += '<p>' + data.errors[count] + '</p>';
}
html += '</div>';
}
if(data.success)
{
alert("add");
html = '<diV class="alert alert-success">' + data.success + '</div>';
$('#client_form')[0].reset();
$('#table_id').DataTable().ajax.reload();
}
$('#result').html(html);
}
})
});
我的控制器代码
public function update(Request $request)
{
$rules = array(
'client_name' => 'required',
'client_address' => 'required',
'client_bdate' => 'required'
);
$error = Validator::make($request->all(), $rules);
if($error->fails())
{
return response()->json(['errors'=>$error->errors()->all()]);
}
$form_data = array(
'client_name' => $request->client_name,
'client_address' => $request->client_address,
'client_bdate' => $request->client_bdate
);
Clients::find($request->hidden_id)->update($form_data);
return response()->json(['success' => 'Data Updated']);
}
编辑... 我的路线
Route::resource('/Clients', 'clientsCont');
答案 0 :(得分:1)
在您的控制器中,您缺少第二个参数。
所以尝试这样:
public function update(Request $request, Client $client)
{
$rules = array(
'client_name' => 'required',
'client_address' => 'required',
'client_bdate' => 'required'
);
$error = Validator::make($request->all(), $rules);
if($error->fails())
{
return response()->json(['errors'=>$error->errors()->all()]);
}
$form_data = array(
'client_name' => $request->client_name,
'client_address' => $request->client_address,
'client_bdate' => $request->client_bdate
);
// You should get your client in variable $client
//Clients::find($request->hidden_id)->update($form_data);
$client->update($form_data);
return response()->json(['success' => 'Data Updated']);
}
还请注意,如果您希望代码看起来更简单,可以按以下方式验证您的请求:
public function update(Request $request, Client $client)
{
$request->validate([
'client_name' => 'required',
'client_address' => 'required',
'client_bdate' => 'required'
])
$client->update($form_data);
return response()->json(['success' => 'Data Updated']);
}
您可以阅读更多here。
祝你好运!
答案 1 :(得分:1)
在路线文件中,将{}从Clients/{Client}
中删除,或者最好将其更改为:Clients/update
,将{}放在某些文本周围时,将绑定一些参数(实际上是Eloquent Model),并且您应该在呼叫路线时提供它(提供ID)。
答案 2 :(得分:0)
首先,让我们放置某些约定。
将路线定义更改为
Route::resource('clients', 'ClientsCont');
按照惯例,控制器名称应为驼峰式,并以大写字母开头。路由名称通常是小写字母。
接下来,确保您的控制器文件正确命名为ClientsCont.php
,并且类名称也应为ClientsCont
。最后,您必须为update()
方法提供第二个参数,以保存要更新的客户端对象。
ClientsCont.php
namespace App\Http\Controllers;
use App\Client;
class ClientsCont extends Controller
{
// class definition
public function update(Request $request, Client $client)
{
$rules = array(
'client_name' => 'required',
'client_address' => 'required',
'client_bdate' => 'required'
);
$error = Validator::make($request->all(), $rules);
if($error->fails())
{
return response()->json(['errors'=>$error->errors()->all()]);
}
$form_data = array(
'client_name' => $request->client_name,
'client_address' => $request->client_address,
'client_bdate' => $request->client_bdate
);
$client->update($form_data);
return response()->json(['success' => 'Data Updated']);
}
}
现在,正确设置您的Ajax请求。
$('#client_form').on('submit', function(event){
var url;
if($('#action').val() == 'Add')
{
url = "{{ route('clients.store') }}";
}else{
url = "{{ route('clients.update') }}";
}
$.ajax({
url: url,
method: "POST",
data: new FormData(this),
cache: false,
dataType: "json",
success:function(data)
{
var html = '';
if(data.errors)
{
html = '<diV class="alert alert-danger">';
for(var count = 0; count < data.errors.length; count++)
{
html += '<p>' + data.errors[count] + '</p>';
}
html += '</div>';
}
if(data.success)
{
alert("add");
html = '<diV class="alert alert-success">' + data.success + '</div>';
$('#client_form')[0].reset();
$('#table_id').DataTable().ajax.reload();
}
$('#result').html(html);
}
})
return false;
});
通常,使用return false;
是停止默认事件动作和传播的首选方法。
[return false;] 通常在jQuery代码中看到,它防止浏览器的默认行为,防止事件使DOM冒泡,并立即从任何回调中返回。
有关完整详细信息,请参见此medium write-up。
此外,从您的代码中,某些ajax设置是不必要的,应将其省略,以便使用其默认值。这些默认值通常适用于大多数表单。
例如,使用processData: false
的jQuery Ajax设置将禁用处理表单数据,并使用对象的toString()
方法来形成请求数据字符串。
当您将数据设置为通用对象而不是将processData设置为false的字符串时,jQuery不会处理该对象。该对象将按原样传递给Ajax调用,并像使用String一样使用。默认情况下,此方法调用toString方法,并将结果作为Ajax请求中的数据发送到服务器。
有关完整说明,请参见this。确保需要此设置,或者将其全部丢弃。
您可能需要舍弃的另一个Ajax设置是contentType: false
,但您有充分的理由进行设置。