«Render: Nothing => true» renvoie un fichier en clair vide?

116

Je suis sur Rails 2.3.3 et je dois créer un lien qui envoie une demande de publication.

J'en ai un qui ressemble à ceci:

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

Ce qui rend le comportement JavaScript approprié sur le lien:

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

L'action de mon contrôleur fonctionne et est configurée pour ne rien rendre:

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

Mais lorsque je clique sur le lien, mon navigateur télécharge un fichier texte vide nommé «resend_confirm_email».

Ce qui donne?

user225643
la source
Pour les rails 5, vous pouvez consulter cette réponse stackoverflow.com/a/34688727/1770571
Salma Gomaa

Réponses:

146

MISE À JOUR: Ceci est une ancienne réponse pour les versions héritées de Rails. Pour Rails 4+, voir l'article de William Denniss ci-dessous.

Il me semble que le type de contenu de la réponse n'est pas correct ou n'est pas correctement interprété dans votre navigateur. Vérifiez à nouveau vos en-têtes http pour voir le type de contenu de la réponse.

Si c'est autre chose que text/html, vous pouvez essayer de définir manuellement le type de contenu comme ceci:

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

Depuis Rails 4, headest désormais préféré à render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

est préféré à

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

# or (equivalent)

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

Ils sont techniquement les mêmes. Si vous regardez la réponse pour l'un ou l'autre utilisant cURL, vous verrez:

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

Cependant, l'appel headoffre une alternative plus évidente à l'appel render :nothingcar il est maintenant explicite que vous ne générez que des en-têtes HTTP.


  1. http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses
William Denniss
la source
Étant donné que cela fonctionne également dans Rails 3, cela devrait être la solution préférée pour cela aussi (mais évidemment, l'OP est sur une application Rails 2.3, donc la réponse choisie était appropriée).
Asfand Qazi
2
head 200se traduit par une 304réponse pour moi (sur les rails 4.1.6). La console affiche le code d'état 200, mais Chrome (panneau réseau) affiche 304. L' render :nothing => trueapproche a fonctionné.
Bastian Hofmann
2
Le type de contenu est-il nécessaire si seul un en-tête est renvoyé?
Usagi le