“render :nothing => true” returns empty plaintext file?

落爺英雄遲暮 提交于 2019-11-30 06:11:28

问题


I'm on Rails 2.3.3, and I need to make a link that sends a post request.

I have one that looks like this:

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

Which makes the appropriate JavaScript behavior on the link:

<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>'

My controller action is working, and set to render nothing:

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

But when I click the link, my browser downloads an empty text file named "resend_confirm_email."

What gives?


回答1:


UPDATE: This is an old answer for legacy Rails versions. For Rails 4+, see William Denniss' post below.

Sounds to me like the content type of the response isn't correct, or isn't correctly interpreted in your browser. Double check your http headers to see what content type the response is.

If it's anything other than text/html, you can try to manually set the content type like this:

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



回答2:


Since Rails 4, head is now preferred over render :nothing.1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

is preferred over

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

# or (equivalent)

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

They are technically the same. If you look at the response for either using cURL, you will see:

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

However, calling head provides a more obvious alternative to calling render :nothing because it's now explicit that you're only generating HTTP headers.


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


来源:https://stackoverflow.com/questions/4632271/render-nothing-true-returns-empty-plaintext-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!