“Render: nothing => true” mengembalikan file teks biasa yang kosong?

116

Saya di Rails 2.3.3, dan saya perlu membuat tautan yang mengirimkan permintaan pos.

Saya punya satu yang terlihat seperti ini:

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

Yang membuat perilaku JavaScript sesuai pada tautan:

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

Tindakan pengontrol saya berfungsi, dan disetel untuk tidak merender apa pun:

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

Tetapi ketika saya mengklik link tersebut, browser saya mendownload file teks kosong bernama "resend_confirm_email."

Apa yang memberi?

pengguna225643
sumber
Untuk rel 5, Anda dapat meninjau jawaban ini stackoverflow.com/a/34688727/1770571
Salma Gomaa

Jawaban:

146

UPDATE: Ini adalah jawaban lama untuk versi Rails lama. Untuk Rails 4+, lihat postingan William Denniss di bawah.

Bagi saya, jenis konten dari responsnya tidak benar, atau tidak diinterpretasikan dengan benar di browser Anda. Periksa kembali tajuk http Anda untuk melihat jenis konten tanggapannya.

Jika selain itu text/html, Anda dapat mencoba mengatur jenis konten secara manual seperti ini:

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

Sejak Rails 4, headsekarang lebih disukai render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

lebih disukai daripada

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

# or (equivalent)

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

Mereka secara teknis sama. Jika Anda melihat respons untuk menggunakan cURL, Anda akan melihat:

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

Namun, memanggil headmemberikan alternatif yang lebih jelas untuk memanggil render :nothingkarena sekarang eksplisit bahwa Anda hanya membuat header HTTP.


  1. http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses
William Denniss
sumber
Karena ini juga berfungsi di Rails 3, ini juga harus menjadi solusi yang disukai (tapi jelas OP ada di aplikasi Rails 2.3 sehingga jawaban yang dipilih sesuai).
Asfand Qazi
2
head 200menghasilkan 304tanggapan bagi saya (pada rel 4.1.6). Konsol menampilkan 200 kode status, tetapi chrome (panel jaringan) menampilkan 304. render :nothing => truePendekatan ini berhasil.
Bastian Hofmann
2
Apakah tipe konten diperlukan jika hanya header yang dikembalikan?
Usagi