我想在简单的CRUD编辑表单上创建一个取消按钮。但是,当有验证错误时,取消按钮似乎不起作用。
我猜因为它从控制器@编辑路由到控制器@更新按钮只是再次转到控制器@编辑而不是实际的前一页。这是正常的还是我做错了什么?我如何使它工作?
与会者/ 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() }}
routes.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'));
}
答案 0 :(得分:2)
它实际上正常工作,只是用法不正确。
采取以下措施:
GET /attendee/edit/{id}
POST /attendee/edit/{id}
GET /attendee/edit/{id}
您无法使用GET
以外的方法链接到某个页面。您之前的路线实际上是POST /attendee/edit/{id}
,但链接始终为GET
。
相反,指定要重定向到的页面,我通常使用该部分的索引。
答案 1 :(得分:2)
我认为你应该添加一个隐藏的输入,比如这个
{!! Form::hidden('redirect_to', old('redirect_to', URL::previous())) !!}
并在您的链接中使用此值:
<a href="{{ old('redirect_to', URL::previous())}}">cancel</a>
答案 2 :(得分:1)
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/
,但这一切都取决于您网站的结构。
答案 3 :(得分:0)
我用这个jquery作为取消按钮。
$(document).ready(function(){
$('a.back').click(function(){
parent.history.back();
return false;
});
});
答案 4 :(得分:0)
您可以使用前端验证来测试输入验证,而无需重新加载页面。因此{{URL :: previous()}}不会受到影响。 这样做的简单方法是在Laravel cade中使用Ajax或validator.js。
以下是如何在Laravel 5中使用jquery ajax来测试验证的完整示例,可能会有所帮助: http://itsolutionstuff.com/post/laravel-5-ajax-request-validation-exampleexample.html
答案 5 :(得分:0)
我现在在 onclick 中通过JS使用浏览器。似乎可以工作:
<a onclick="window.history.back();">Back</a>