“ render:nothing => true”是否返回空的纯文本文件?


116

我在Rails 2.3.3上,我需要建立一个链接来发送发布请求。

我有一个看起来像这样的人:

= link_to('Resend Email', 
  {:controller => 'account', :action => 'resend_confirm_email'}, 
  {:method => :post} )

这使得链接上具有适当的JavaScript行为:

<a href="/account/resend_confirm_email" 
  onclick="var f = document.createElement('form'); 
  f.style.display = 'none'; 
  this.parentNode.appendChild(f); 
  f.method = 'POST'; 
  f.action = this.href;
  var s = document.createElement('input'); 
  s.setAttribute('type', 'hidden'); 
  s.setAttribute('name', 'authenticity_token'); 
  s.setAttribute('value', 'EL9GYgLL6kdT/eIAzBritmB2OVZEXGRytPv3lcCdGhs=');
  f.appendChild(s);
  f.submit();
  return false;">Resend Email</a>'

我的控制器动作正常,并设置为不呈现任何内容:

respond_to do |format|
  format.all { render :nothing => true, :status => 200 }
end

但是,当我单击链接时,我的浏览器会下载一个名为“ resend_confirm_email”的空文本文件。

是什么赋予了?


对于Rails 5,您可以查看此答案stackoverflow.com/a/34688727/1770571
Salma Gomaa,2017年

Answers:


146

更新:这是旧版Rails的旧答案。对于Rails 4+,请参见下面的William Denniss的文章。

在我看来,响应的内容类型不正确,或者在浏览器中未正确解释。仔细检查您的http标头,以查看响应的内容类型。

如果不是text/html,您可以尝试手动设置内容类型,如下所示:

render :nothing => true, :status => 200, :content_type => 'text/html'

258

从Rails 4开始,head现在首选render :nothing1个

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

优先于

render nothing: true, status: :ok, content_type: "text/html"

# or (equivalent)

render nothing: true, status: 200, content_type: "text/html"

它们在技术上是相同的。如果查看使用cURL的响应,您将看到:

HTTP/1.1 200 OK
Connection: close
Date: Wed, 1 Oct 2014 05:25:00 GMT
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
X-Runtime: 0.014297
Set-Cookie: _blog_session=...snip...; path=/; HttpOnly
Cache-Control: no-cache

但是,调用head提供了一种比调用更明显的替代方法,render :nothing因为现在很明显,您仅生成HTTP标头。


  1. http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses

由于这在Rails 3中也适用,因此它也应该是首选的解决方案(但显然OP在Rails 2.3应用程序上,因此选择的答案是适当的)。
Asfand Qazi 2014年

2
head 200304对我产生了回应(在4.1.6上)。控制台显示200个状态码,但是chrome(网络面板)显示304。此render :nothing => true方法有效。
巴斯蒂安·霍夫曼

2
如果仅返回标头,是否需要内容类型?
Usagi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.