我想在一个简单的 CRUD 编辑表单上制作一个取消按钮。但是,当出现验证错误时,取消按钮似乎不起作用。
我猜是因为它从controller@edit路由到controller@update按钮只是再次转到controller@edit而不是实际的上一页。这正常还是我做错了什么?我如何让它工作?
attendee/edit.blade.php
<div class=pull-right>
{{Form::submit('Update',array('class'=>'btn btn-success'))}}
<a href = "{{URL::previous()}}" class = 'btn btn-warning'>Cancel</a>
</div>
{{ Form::close() }}
路线.php
Route::get('user/attendees', 'UserController@getAttendees');
Route::resource('attendee', 'AttendeeController');
与会者控制器
public function edit($id)
{
$user = Auth::user();
if(empty($user->id))
return Redirect::to('/');
//return if attendee doesn't belong to user
if( !($user->attendee->contains($id)) )
return Redirect::to('user/index')->with( 'error', 'attendee id error.' );
$attendee = Attendee::find($id);
return View::make('attendees.edit', compact('attendee'));
}
/**
* Update the specified attendee in storage.
*
* @param int $id
* @return Response
*/
public function update($id)
{
$attendee = Attendee::findOrFail($id);
$validator = Validator::make($data = Input::all(), Attendee::$rules);
if ($validator->fails())
{
return Redirect::back()->withErrors($validator)->withInput()->with('id', $id);
}
$attendee->update($data);
return Redirect::intended();
}
用户控制器
public function getAttendees()
{
list($user,$redirect) = $this->user->checkAuthAndRedirect('user');
if($redirect){return $redirect;}
// Show the page
return View::make('site/user/attendees/index', compact('user'));
}
它实际上工作正常,只是用法不正确。
采取以下措施:
- 您在
GET /attendee/edit/{id}
提交表单 - 该表格将带您进入
POST /attendee/edit/{id}
- 验证失败,并被重定向到
GET /attendee/edit/{id}
不能使用 GET
以外的方法链接到页面。您之前的路线实际上是POST /attendee/edit/{id}
,但链接将始终GET
。
相反,指定要重定向到的页面,我通常使用该部分的索引。
我认为你应该添加一个隐藏的输入,就像这样
{!! Form::hidden('redirect_to', old('redirect_to', URL::previous())) !!}
并在链接中使用此值:
<a href="{{ old('redirect_to', URL::previous())}}">cancel</a>
在使用 Laravel 提供的验证器时,Redirect::back()
并没有真正完成正确的事情。我之前所做的是将要重定向的页面作为表单中的隐藏输入传递回,然后简单地使用 Input::except("return")
忽略它。我的意思是:
// On your HTML Form
<input type="hidden" name="return" value="{{ Request::path() }}" />
// In your PHP Controller
$validator = Validator::make($data = Input::except("return"), Attendee::$rules);
if ($validator->fails())
{
return Redirect::to(Input::get("return"))->withErrors($validator)->withInput()->with('id', $id);
}
希望这可以帮助阐明一些信息。其他选项正在返回到更高的位置,例如而不是attendee/edit/{id}
重定向到attendee/edit/
,但这完全取决于您网站的结构。
我现在正在通过 JS 在点击中使用浏览器。似乎有效:
<a onclick="window.history.back();">Back</a>
我用这个jquery来取消按钮。
$(document).ready(function(){
$('a.back').click(function(){
parent.history.back();
return false;
});
});
您可以使用前端验证来测试输入验证,而无需重新加载页面。所以 {{URL::p revious()}} 不会受到影响。最简单的方法是在你的Laravelcade中使用Ajax或验证器.js。
以下是如何在Laravel 5中使用jquery ajax来测试验证的完整示例,可能会有所帮助:http://itsolutionstuff.com/post/laravel-5-ajax-request-validation-exampleexample.html