129 votes

"render :nothing => true" renvoie un fichier vide en texte clair ?

Je suis sur Rails 2.3.3, et j'ai besoin de créer un lien qui envoie une requête de poste.

J'en ai un qui ressemble à ça :

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

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

<a href="http://stackoverflow.com/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 quand je clique sur le lien, mon navigateur télécharge un fichier texte vide nommé "resend_confirm_email".

Qu'est-ce qui se passe ?

286voto

William Denniss Points 3781

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

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 en 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, appeler head fournit une alternative plus évidente à l'appel render :nothing car 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
  2. http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-nothing

148voto

vonconrad Points 14378

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 vos en-têtes http pour voir quel est 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 suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X