“Render: nothing => true” retorna um arquivo de texto simples vazio?

116

Estou no Rails 2.3.3 e preciso fazer um link que envie uma solicitação de postagem.

Eu tenho um que se parece com este:

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

O que torna o comportamento apropriado do JavaScript no 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>'

Minha ação do controlador está funcionando e definida para não renderizar:

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

Mas quando eu clico no link, meu navegador baixa um arquivo de texto vazio chamado "resend_confirm_email."

O que da?

user225643
fonte
Para trilhos 5, você pode revisar esta resposta stackoverflow.com/a/34688727/1770571
Salma Gomaa

Respostas:

146

ATUALIZAÇÃO: Esta é uma resposta antiga para versões Rails legadas. Para Rails 4+, veja a postagem de William Denniss abaixo.

Parece-me que o tipo de conteúdo da resposta não está correto ou não foi interpretado corretamente em seu navegador. Verifique novamente os cabeçalhos http para ver o tipo de conteúdo da resposta.

Se não for text/html, você pode tentar definir manualmente o tipo de conteúdo desta forma:

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

Desde Rails 4, headagora é preferível render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

é preferido sobre

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

# or (equivalent)

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

Eles são tecnicamente iguais. Se você olhar a resposta para qualquer um usando cURL, verá:

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

No entanto, chamar headfornece uma alternativa mais óbvia para chamar render :nothingporque agora está explícito que você está gerando apenas cabeçalhos HTTP.


  1. http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses
William Denniss
fonte
Como isso também funciona no Rails 3, deve ser a solução preferida para isso também (mas obviamente o OP está em um aplicativo Rails 2.3, então a resposta escolhida foi apropriada).
Asfand Qazi
2
head 200resulta em uma 304resposta para mim (on rails 4.1.6). O console mostra 200 códigos de status, mas o cromo (painel de rede) mostra 304. A render :nothing => trueabordagem funcionou.
Bastian Hofmann
2
O tipo de conteúdo é necessário se apenas um cabeçalho estiver sendo retornado?
Usagi