Laravel嵌套资源路由配合AJAX调用出现gallery变量未定义如何解决
问题原因
Undefined variable: gallery 错误本质是你在视图中调用了未传入的
$gallery变量,且业务逻辑存在前置问题:
- 你的
GalleryController@create方法仅给视图传递了$product变量,没有传递任何$gallery实例,视图中自然找不到该变量 - 当前你处于新建画廊的页面,还没有创建任何画廊记录,本身就不存在可删除的
$gallery对象,此时放置删除操作的逻辑本身不符合业务流程
解决方案
按你实际业务场景选择对应修复方式:
场景1:在已创建画廊的列表页做删除操作(标准业务场景)
如果是在产品关联画廊列表页,给每个已存在的画廊记录加删除功能,操作如下:
- 修改对应控制器方法,把画廊列表数据传给视图,以产品详情页为例:
// 先确保Product模型已经定义了和Gallery的一对多关联 public function show(Product $product) { $galleries = $product->galleries; return view('Admin.products.show', compact('product', 'galleries')); }
- 视图中循环遍历每个画廊实例,把对应ID挂载到删除按钮的自定义属性上:
@foreach($galleries as $gallery) <tr> <td>{{ $gallery->name }}</td> <td> <button class="delete-gallery-btn" data-delete-url="{{ route('products.galleries.destroy', [$product->id, $gallery->id]) }}" >删除</button> </td> </tr> @endforeach
- 调整AJAX代码,动态获取点击按钮的路由,同时修复你代码中已有的其他错误:
$('.delete-gallery-btn').click(function() { $.ajax({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, type: 'DELETE', // 资源路由destroy方法默认对应DELETE请求,不能用POST url: $(this).data('delete-url'), // 动态取按钮上的路由,避免全局调用不存在的PHP变量 data: {filename, name}, // 修复你之前把data写成date的拼写错误 success: function (data) { console.log('File has been successfully removed!!'); }, error: function (e){ console.log(e); }, }); });
场景2:在新建画廊页删除刚上传的临时文件
如果是在新建页面上传了文件还没提交保存到数据库,要删除临时文件,不需要调用products.galleries.destroy路由,单独新增一个处理临时文件删除的公共路由即可,不需要传递不存在的$gallery->id参数。
内容的提问来源于stack exchange,提问作者user16277300
相关产品推荐
相关产品推荐

