“ render: nothing => true” ส่งคืนไฟล์ข้อความธรรมดาที่ว่างเปล่า?


116

ฉันใช้ Rails 2.3.3 และฉันต้องการสร้างลิงค์เพื่อส่งคำขอโพสต์

ฉันมีอันที่มีลักษณะดังนี้:

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

ซึ่งทำให้พฤติกรรม JavaScript ที่เหมาะสมบนลิงก์:

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

การดำเนินการควบคุมของฉันใช้งานได้และตั้งค่าให้ไม่แสดงผล:

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

แต่เมื่อฉันคลิกลิงก์เบราว์เซอร์ของฉันจะดาวน์โหลดไฟล์ข้อความว่างชื่อ "Resend_confirm_email"

สิ่งที่ช่วยให้?


สำหรับราง 5 คุณสามารถดูคำตอบนี้ได้stackoverflow.com/a/34688727/1770571
Salma Gomaa

คำตอบ:


146

อัปเดต: นี่เป็นคำตอบเก่าสำหรับเวอร์ชัน Rails เดิม สำหรับ Rails 4+ โปรดดูโพสต์ของ William Denniss ด้านล่าง

สำหรับฉันดูเหมือนว่าประเภทเนื้อหาของการตอบกลับไม่ถูกต้องหรือตีความไม่ถูกต้องในเบราว์เซอร์ของคุณ ตรวจสอบส่วนหัว http ของคุณอีกครั้งเพื่อดูว่าการตอบกลับเป็นเนื้อหาประเภทใด

หากเป็นอย่างอื่นtext/htmlคุณสามารถลองตั้งค่าประเภทเนื้อหาด้วยตนเองดังนี้:

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

258

ตั้งแต่ทางรถไฟ 4 เป็นที่ต้องการในขณะนี้มากกว่าhead 1render :nothing

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

เป็นที่ต้องการมากกว่า

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

# or (equivalent)

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

พวกเขาเหมือนกันในทางเทคนิค หากคุณดูการตอบสนองสำหรับการใช้ cURL คุณจะเห็น:

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

อย่างไรก็ตามการโทรheadเป็นทางเลือกที่ชัดเจนกว่าการโทรrender :nothingเนื่องจากตอนนี้มีความชัดเจนว่าคุณกำลังสร้างเฉพาะส่วนหัว HTTP เท่านั้น


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

เนื่องจากสิ่งนี้ใช้งานได้ใน Rails 3 จึงควรเป็นโซลูชันที่ต้องการเช่นกัน (แต่เห็นได้ชัดว่า OP อยู่ในแอป Rails 2.3 ดังนั้นคำตอบที่เลือกจึงเหมาะสม)
Asfand Qazi

2
head 200ผลลัพธ์ในการ304ตอบสนองสำหรับฉัน (บนราง 4.1.6) คอนโซลแสดงรหัสสถานะ 200 แต่โครเมี่ยม (แผงเครือข่าย) แสดง 304 render :nothing => trueวิธีนี้ใช้ได้ผล
Bastian Hofmann

2
ประเภทเนื้อหาจำเป็นหรือไม่หากส่งคืนเฉพาะส่วนหัว
Usagi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.