我在Rails 3.2应用程序中重定向和渲染有一个奇怪的问题。
从我的创建控制器操作,我得到以下respond_to块
// request type here is JSON
respond_to do |format|
format.json { redirect_to( v2_promote_path(@challenge), content_type: "text/html") }
end
...在同一个控制器中重定向到以下操作:
def promote
// request type is JSON here
request.format = :html
@challenge = Challenge.find(params[:id])
respond_to do |format|
format.html { render '/challenges/v2/promote_challenge.html.erb'}
end
end
奇怪的是,这会在HTTP响应中呈现promote_challenge模板,但浏览器不会显示它。
重定向操作获取application / json的请求类型,即使我在重定向调用中将其显式设置为HTML,HTML仍然只在响应中呈现,而不是在浏览器中呈现。
问题:为什么我在响应中获取HTML,而不是在浏览器中?
以下是请求/响应标头:
REQUEST:
GET /v2/challenges/18236/promote HTTP/1.1
Host: localhost:3000
Connection: keep-alive
X-XSRF-TOKEN: asldfkasldkfas=
X-Requested-With: XMLHttpRequest
Accept: application/json, text/plain, */*
Referer: http://localhost:3000/v2/challenges/preview
RESPONSE:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=0, private, must-revalidate
Connection: close
答案 0 :(得分:1)
您可以尝试使用format
吗?
redirect_to( v2_promote_path(@challenge), format: :html)
答案 1 :(得分:1)
接受的hacky解决方案非常难看;我们可以同意这一点。它只是让rails告诉客户端执行将执行重定向的Javascript。
在我看来,一个更干净的解决方案是在JS中处理成功回调中的重定向:
在rails中 render :json => { status: 'success' }
然后做一些像
success: function(data) {
// Send user to next page.
window.location.href = "http://www.myawesomesite.com/page";
},
在JS。