在某些情况下,我们需要以POST方式来实现跳转,一种典型的情况就是:
- 未登录用户提交了一个POST请求来创建某个东西
- 用户被重定向到登录页面
- 用户完成登录后,Redirect用户登录前的POST请求到Controller,并直接完成创建工作
解决方案有两个:
- 将POST改为GET,但是这样就违反了REST的路由规则
- 通过JS在客户端模拟POST请求,但是Rails2.0加入了authenticity_token机制来防止攻击,因此要保证JS能够顺利提交,必须在渲染表单的时候将表单的authenticity_token保存起来,在需要扩展Rails,相当麻烦
这里我们介绍第3种方法,使用render_component,以RESTful AUTH为例:
- 修改authenticated_system.rb,在跳转到new_session_path之前,先保存当前请求的相关信息:
- 修改SessionsController#create,用户登录成功后,继续执行原有请求:
def access_denied
respond_to do |format|
format.html do
store_request
redirect_to new_session_path
end
....
end
def store_request
session[:controller] = controller_name
session[:action] = action_name
session[:params] = params
end
def create
if ....
return render_component :controller => session[:controller],
:action => session[:action],
:params => session[:params]
flash[:notice] = "Logged in successfully"
else
render :action => 'new'
end
end
这个方法实际上不能算作是Redirect POST请求,只是与它达到了同样的效果而已,不过,从协议角度来讲,Redirect POST请求实际上是不可实现的,因为HTTP协议不支持这么干。
