更新后如何正确转发到另一个视图

时间:2019-04-01 22:43:40

标签: php laravel

我的Web应用程序中有很多表格。但是,我注意到,一旦我完成了一篇帖子并将用户转发到新页面,URL仍然是更新的URL。这样,用户就是刷新页面,它会重新提交请求。

下面是我处理转发的方式。

public function update(Request $request, Wedding $wedding, User $user)
{
    $user->attending = ($request->attending != null);
    $user->save();

    $message = "Sorry to hear you won't make it!";

    if ($user->attending) {
        $message = 'Welcome to the party pal!';
    }

    return view('pages.guest.rsvp')
        ->with(compact('wedding'))
        ->with(compact('user'))
        ->with('success', $message);
}

因此,一旦执行了“返回视图...”,用户就可以转到给定的视图,这很好,但是它允许他们刷新页面并重新提交相同的帖子。

我已经使用以下代码作为替代测试。

return redirect('/{$wedding->id}/rsvp')
    ->with(compact('wedding'))
    ->with(compact('user'))
    ->with('success', $message);

但是,这似乎并没有通过变量(例如“成功”消息)。另外,这依赖于我每次使用所有URL参数手动键入URL,而仅告诉它使用哪个视图似乎更干净。


更新:为响应МаксимСтепанов,我用以下内容更新了路线:

Route::get('rsvp', 'Guest\MenuController@index')->name('rsvp');

确实可以工作(谢谢您),但是,我现在正在这样重定向:

return redirect()
        ->route('rsvp', ['wedding' => $wedding])
        ->with('success', $message);

虽然重定向确实起作用,但成功消息似乎不起作用,但消息是通过以下方式捕获的:

@if (isset($success))
    <div class="alert alert-success">
        {{$success}}
    </div>
@endif

我一直在寻找有关“-> with(...”中的项目为何不通过重定向进行操作的指南,但是我找不到任何人遇到此问题-我假设它与某些问题有关我在做,我只是想不通。

3 个答案:

答案 0 :(得分:1)

使用with方法访问要传递的变量时遇到问题的原因是with方法将数据闪烁到会话中,而不是直接传递到视图中。请参阅以下参考。

https://laravel.com/docs/5.8/redirects#redirecting-with-flashed-session-data

因此,为了访问视图中的变量,您只需从会话数据中提取成功消息

@if (session('success'))
    <div class="alert alert-success">
        {{ session('success')}}
    </div>
@endif

答案 1 :(得分:1)

只需将route帮助程序与redirect帮助程序一起使用,即可指定您要转到的路线名称:

return redirect()->route('your.route.name')->with([...]);

注意:这需要您命名路线,例如

Route::get('/test', 'SomeController@index')->name('your.route.name');

或者您可以将URL直接传递到redirect

当您自己调用view时,尽管它会加载实际的view,但不会触发相应的控制器,因为该控制器绑定到了请求而不是实际的视图上。


with帮助程序会创建一个Flash会话项,因此,您需要在刀片中通过session帮助程序而不是直接变量来访问它:

@if (session('success'))
    <div class="alert alert-success">
        {{ session('success') }}
    </div>
@endif

答案 2 :(得分:0)

路线:

function(data) {
  $.each(data, function(key, value) {
    tempData += '<tr>';
    tempData += '<td>' + value.name + '</td>';
    tempData += '<td>' + value.value + '</td>';

    //check whether the key already exists in the map
    measurementDataObj[value.name] = measurementDataObj[value.name] || [];
    measurementDataObj[value.name].push(value.value);
  });
}

控制器:

Route::get('/{$wedding}/rsvp', 'UpdateController@update')->name('wedding');

return redirect()->route('wedding', ['id' => $wedding->id])->with('success', $message);