我与用户和产品表之间有很多关系,我设置了一个视图(welcome.blade.php),当我单击产品名称(即链接)时,应该将我重定向到页面我的删除表单是这样,所以我可以删除该特定产品,但是却出现404 not found页面。我怀疑错误可能出在我的路线上,但我似乎找不到问题。另外,当我单击某些产品时,我的网址显示为project / destroy / 1,我认为这很好。这是我的代码:
web.php:
Route::get('/home', 'HomeController@index')->name('home');
Route::post('/store', 'HomeController@store')->name('store');
Route::delete('/destroy/{$id}', 'HomeController@destroy')->name('destroy');
destroy.blade.php:
<div class="col-md-12">
<form action="destroy/{{ $product->id }}" method="POST">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">Delete</button>
</form>
</div>
welcome.blade.php:
@if($products)
<table class="table">
<thead>
<th>#</th>
<th>Product Name</th>
<th>Owner Of The Product</th>
<th>Created At</th>
</thead>
<tbody>
@foreach ($products as $product)
<tr>
<td>{{ $product->id }}</td>
<td>
<a href="{{ route('destroy', $product->id) }}">{{ $product->files }}</a>
</td>
<td>
@foreach ($product->users as $user) {{ $user->name }}
@endforeach
</td>
<td>{{ date('M j, Y', strtotime($product->created_at)) }}</td>
</tr>
@endforeach
</tbody>
</table>
@endif
HomeController.php:
<?php
namespace App\Http\Controllers;
use App\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class HomeController extends Controller
{
public function destroy(Product $product)
{
$product->users()->detach();
$product->delete();
return view('destroy');
}
}
答案 0 :(得分:1)
您在文件中定义了以下路由。
Route::delete('/destroy/{$id}', 'HomeController@destroy')->name('destroy');
这将创建一个删除路线。 删除路由应由API访问。定位标记中的链接使用 GET 路由。点击
<a href="{{ route('destroy' , $product->id) }}">{{ $product->files }}</a>
使路由器尝试匹配未定义的 GET /destroy/{$id}
,因此如果打开了调试,它将抛出异常,否则,将抛出404。您可以通过查看浏览器开发者控制台的“网络”标签来了解这一点。
除非您添加其他 GET 路线,否则您将不断获得404。
Route::get('/destroy/{$id}', 'HomeController@destroy')->name('product.destroy-form');
将使以下链接正常工作。
<a href="{{ route('product.destroy-form' , $product->id) }}">{{ $product->files }}</a>
此外,在destroy方法中,您将返回视图而未传递任何变量,但是在destroy.blade.php
中,您似乎正在使用$product
。不要忘记添加它!
答案 1 :(得分:0)
我认为这是因为使用新页面删除产品,首先要做的是导航到您未使用的页面。相反,您将使用
直接进入删除功能Route::delete('/destroy/{$id}', 'HomeController@destroy')->name('destroy');
您需要定义一条路线,让您首先进入该页面,您可以通过创建如下路线来做到这一点:
Route::get('/delete/{$id}', 'HomeController@delete')->name('delete');
您应该在HomeController中创建一个新的删除函数,该函数仅返回destroy.blade.php。这样的事情。
$product= Product::find($id);
return view('destroy')->with('product', $product);
其中$ id是产品ID,而Product是您使用的型号。
答案 2 :(得分:0)
您已经快要走了,步子太多了。
在表单上调用良好并使用delete方法,这绝对是您应该做的
但是,您出了错的地方是使用链接转到带有要删除的表单的单独页面。您最好使用一些JavaScript,以便该链接从该链接提交隐藏的表单。
<a onclick="document.getElementById('delete-form-{{$product->id}}').submit();}">{{ $product->files }}</a>
<form id="delete-form-{{$product->id}}" action="{{ route('destroy', ['id' => $product->id]) }}" method="POST" style="display: none;">
@csrf
@method('delete')
</form>
您可以执行已有的方法,但是需要附加的route :: get请求到加载表单的页面,然后可以在该页面上提交表单以删除。