“Render: nothing => true” trả về tệp bản rõ trống?


116

Tôi đang sử dụng Rails 2.3.3 và tôi cần tạo một liên kết để gửi yêu cầu đăng bài.

Tôi có một cái trông như thế này:

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

Điều nào tạo nên hành vi JavaScript thích hợp trên liên kết:

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

Tác vụ bộ điều khiển của tôi đang hoạt động và không hiển thị gì:

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

Nhưng khi tôi nhấp vào liên kết, trình duyệt của tôi tải xuống một tệp văn bản trống có tên "gửi lại_confirm_email."

Đưa cái gì?


Đối với đường ray 5, bạn có thể xem câu trả lời này stackoverflow.com/a/34688727/1770571
Salma Gomaa

Câu trả lời:


146

CẬP NHẬT: Đây là câu trả lời cũ cho các phiên bản Rails kế thừa. Đối với Rails 4+, hãy xem bài đăng của William Denniss bên dưới.

Tôi nghe có vẻ như loại nội dung của phản hồi không đúng hoặc không được diễn giải chính xác trong trình duyệt của bạn. Kiểm tra kỹ các tiêu đề http của bạn để xem phản hồi thuộc loại nội dung nào.

Nếu đó là bất kỳ điều gì khác text/html, bạn có thể thử đặt loại nội dung theo cách thủ công như sau:

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

258

Kể từ Rails 4, headbây giờ được ưu tiên hơn render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

được ưu tiên hơn

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

# or (equivalent)

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

Về mặt kỹ thuật chúng giống nhau. Nếu bạn xem phản hồi cho một trong hai việc sử dụng cURL, bạn sẽ thấy:

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

Tuy nhiên, việc gọi headcung cấp một giải pháp thay thế rõ ràng hơn cho việc gọi render :nothingbởi vì bây giờ rõ ràng là bạn chỉ tạo tiêu đề HTTP.


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

Vì điều này cũng hoạt động trong Rails 3, nên nó cũng sẽ là giải pháp ưu tiên cho điều đó (nhưng rõ ràng là OP trên ứng dụng Rails 2.3 nên câu trả lời được chọn là phù hợp).
Asfand Qazi

2
head 200dẫn đến một 304phản hồi cho tôi (trên đường ray 4.1.6). Bảng điều khiển hiển thị mã trạng thái 200, nhưng chrome (bảng điều khiển mạng) hiển thị 304. Phương render :nothing => truepháp này đã hoạt động.
Bastian Hofmann

2
Loại nội dung có cần thiết không nếu chỉ trả về một tiêu đề?
Usagi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.