Rails重定向呈现HTML,但浏览器不显示它

时间:2014-02-05 18:08:53

标签: ruby-on-rails http

我在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

2 个答案:

答案 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。