"Render: nothing => true" devuelve un archivo de texto plano vacío?

116

Estoy en Rails 2.3.3 y necesito crear un enlace que envíe una solicitud de publicación.

Tengo uno que se parece a esto:

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

Lo que hace que el comportamiento de JavaScript sea apropiado en el enlace:

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

La acción de mi controlador está funcionando y está configurada para no representar nada:

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

Pero cuando hago clic en el enlace, mi navegador descarga un archivo de texto vacío llamado "resend_confirm_email".

¿Lo que da?

user225643
fuente
Para rieles 5, puede revisar esta respuesta stackoverflow.com/a/34688727/1770571
Salma Gomaa

Respuestas:

146

ACTUALIZACIÓN: Esta es una respuesta antigua para las versiones heredadas de Rails. Para Rails 4+, consulte la publicación de William Denniss a continuación.

Me parece que el tipo de contenido de la respuesta no es correcto o no se interpreta correctamente en su navegador. Verifique sus encabezados http para ver qué tipo de contenido es la respuesta.

Si se trata de cualquier otra cosa text/html, puede intentar configurar manualmente el tipo de contenido de esta manera:

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

Desde Rails 4, headahora se prefiere a render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

se prefiere sobre

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

# or (equivalent)

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

Técnicamente son iguales. Si observa la respuesta para usar 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

Sin embargo, llamar headproporciona una alternativa más obvia a llamar render :nothingporque ahora es explícito que solo está generando encabezados HTTP.


  1. http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses
William Denniss
fuente
Dado que esto también funciona en Rails 3, también debería ser la solución preferida para eso (pero obviamente el OP está en una aplicación Rails 2.3, por lo que la respuesta elegida fue apropiada).
Asfand Qazi
2
head 200da como resultado una 304respuesta para mí (en rieles 4.1.6). La consola muestra el código de estado 200, pero Chrome (panel de red) muestra 304. El render :nothing => trueenfoque funcionó.
Bastian Hofmann
2
¿Es necesario el tipo de contenido si solo se devuelve un encabezado?
Usagi