2011-01-08 6 views
92

Sono su Rails 2.3.3 e devo creare un collegamento che invii una richiesta di post."render: nothing => true" restituisce il file di testo in chiaro vuoto?

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

La mia azione di controllo è in funzione, e impostare per rendere 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_ e-mail."

Cosa dà?

+0

Per rotaie 5, è possibile rivedere questa risposta https://stackoverflow.com/a/34688727/1770571 –

+0

Per rotaie 5 è possibile rivedere questa risposta https: //stackoverflow.com/a/34688727/1770571 –

risposta

124

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

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

Se si tratta di qualcosa di diverso da text/html, si può provare a impostare manualmente il tipo di contenuto simile a questo:

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

Dal Rails 4, head è ora preferito su render :nothing. 1

head :ok, content_type: "text/html" 

# or (equivalent) 

head 200, content_type: "text/html" 

è preferito rispetto

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

# or (equivalent) 

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

Sono tecnicamente stesso. Se si guarda alla risposta per entrambi usando curl, si vedrà:

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, chiamando head fornisce una più evidente alternativa chiamare render :nothing perché è ormai esplicito che si sta generando solo le intestazioni HTTP.


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

Grazie, soprattutto per la versione Rails 4 su questo. –

+0

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

+2

'head 200' restituisce una risposta' 304' per me (su rail 4.1.6). La console mostra 200 codici di stato, ma chrome (pannello di rete) mostra 304. L'approccio 'render: nothing => true' ha funzionato. –

Problemi correlati