"Render: nothing => true" restituisce un file di testo in chiaro vuoto?


116

Sono su Rails 2.3.3 e ho bisogno di creare un collegamento che invii una richiesta di post.

Ne ho uno che assomiglia a questo:

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

Il che rende il comportamento JavaScript appropriato sul collegamento:

<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'azione del controller funziona e non è impostata per il rendering di nulla:

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

Ma quando faccio clic sul collegamento, il mio browser scarica un file di testo vuoto denominato "resend_confirm_email".

Cosa succede?


Per rails 5, puoi rivedere questa risposta stackoverflow.com/a/34688727/1770571
Salma Gomaa

Risposte:


146

AGGIORNAMENTO: Questa è una vecchia risposta per le versioni legacy di Rails. Per Rails 4+, vedi il post di William Denniss di seguito.

Mi sembra che il tipo di contenuto della risposta non sia corretto o non sia interpretato correttamente nel tuo browser. Controlla le tue intestazioni http per vedere quale tipo di contenuto è la risposta.

Se è qualcosa di diverso da text/html, puoi provare a impostare manualmente il tipo di contenuto in questo modo:

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

258

A partire da Rails 4, headora è preferibile render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

è preferibile

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

# or (equivalent)

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

Tecnicamente sono la stessa cosa. Se guardi la risposta per entrambi usando cURL, vedrai:

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

Tuttavia, la chiamata headfornisce un'alternativa più ovvia alla chiamata render :nothingperché ora è esplicito che stai generando solo intestazioni HTTP.


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

Dato che funziona anche in Rails 3, dovrebbe essere la soluzione preferita anche per questo (ma ovviamente l'OP è su un'app Rails 2.3 quindi la risposta scelta era appropriata).
Asfand Qazi

2
head 200si traduce in una 304risposta per me (su rotaie 4.1.6). La console mostra il codice di stato 200, ma chrome (pannello di rete) mostra 304. L' render :nothing => trueapproccio ha funzionato.
Bastian Hofmann

2
Il tipo di contenuto è necessario se viene restituita solo un'intestazione?
Usagi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.