"Rendern: nichts => wahr" gibt leere Klartextdatei zurück?

116

Ich bin auf Rails 2.3.3 und muss einen Link erstellen, der eine Post-Anfrage sendet.

Ich habe eine, die so aussieht:

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

Welches macht das entsprechende JavaScript-Verhalten auf dem 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>'

Meine Controller-Aktion funktioniert und ist so eingestellt, dass nichts gerendert wird:

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

Wenn ich jedoch auf den Link klicke, lädt mein Browser eine leere Textdatei mit dem Namen "resend_confirm_email" herunter.

Was gibt?

user225643
quelle
Für Schienen 5 können Sie diese Antwort überprüfen stackoverflow.com/a/34688727/1770571
Salma Gomaa

Antworten:

146

UPDATE: Dies ist eine alte Antwort für ältere Rails-Versionen. Für Rails 4+ siehe William Denniss 'Beitrag unten.

Klingt für mich so, als ob der Inhaltstyp der Antwort nicht korrekt ist oder in Ihrem Browser nicht richtig interpretiert wird. Überprüfen Sie Ihre http-Header, um festzustellen, welcher Inhaltstyp die Antwort ist.

Wenn dies nicht der Fall ist text/html, können Sie versuchen, den Inhaltstyp wie folgt manuell festzulegen:

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

Da Rails 4 headjetzt vorgezogen wird render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

wird gegenüber bevorzugt

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

# or (equivalent)

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

Sie sind technisch gleich. Wenn Sie sich die Antwort für die Verwendung von cURL ansehen, sehen Sie:

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

Das Aufrufen headbietet jedoch eine offensichtlichere Alternative zum Aufrufen, render :nothingda jetzt explizit angegeben wird, dass Sie nur HTTP-Header generieren.


  1. http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses
William Denniss
quelle
Da dies auch in Rails 3 funktioniert, sollte dies auch die bevorzugte Lösung sein (aber offensichtlich befindet sich das OP in einer Rails 2.3-App, sodass die gewählte Antwort angemessen war).
Asfand Qazi
2
head 200führt zu einer 304Antwort für mich (auf Schienen 4.1.6). Die Konsole zeigt 200 Statuscode an, aber Chrome (Netzwerkbedienfeld) zeigt 304. Der render :nothing => trueAnsatz hat funktioniert.
Bastian Hofmann
2
Ist der Inhaltstyp erforderlich, wenn nur ein Header zurückgegeben wird?
Usagi