2012-05-03 44 views
6

Rails 3 hiện đang định tuyến yêu cầu HEAD đến tuyến GET phù hợp. Có cái đầu à? phương thức trên yêu cầu, nhưng trả về false và yêu cầu hoạt động như một yêu cầu get. Tôi có thể phát hiện nếu yêu cầu là yêu cầu HEAD không?Yêu cầu HTTP CHÍNH trong Rails 3

Lý do: Tôi nhận được yêu cầu HEAD phải trả lại các tiêu đề giống CHÍNH XÁC khi nhận, vì vậy Rails muốn thực hiện toàn bộ GET và sau đó cạo khỏi cơ thể. Tuy nhiên, tôi có thể tuân theo yêu cầu này mà không cần phải thực hiện cùng các lệnh gọi DB, v.v. Điều này có nghĩa không?

+0

Bạn có thể cần phải đăng một số mã có liên quan. Cái đầu? nên trả về true cho các yêu cầu HEAD (http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F) – rjk

Trả lời

2

Bạn có thể sử dụng request.head? phương pháp để tìm hiểu xem đó là một yêu cầu HEAD:

http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F

Một khi bạn đã xác định rằng nó là, bạn cũng có thể sử dụng đầu của bộ điều khiển() phương pháp thay vì điển hình render:

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

Vì vậy, tôi chỉ cần kiểm tra request.head? trước khi làm phiền với các hoạt động cơ sở dữ liệu. Sau đó sử dụng

head :ok, :custom_header => 'value' 
+0

Vì vậy, đây là một ý chính với một số [thêm thông tin] (https://gist.github.com/2594991) Bạn có thể thấy rằng HEAD được định tuyến đến GET my Rails, tại thời điểm đó yêu cầu cho biết đó là GET. Tôi đã thử đầu ?, nhưng không thể có được nó để chỉ ra rằng nó là một yêu cầu HEAD. –

1
def index 
    if request.head? 
    head :created 
    else 
    Rails.logger.info "Derp #{request.method}" 
    end 
end 

Hmm. Phương thức điều khiển ở trên hoạt động như tôi mong đợi trên Ruby v1.9.3-p194 và Rails v3.2.3; Cơ quan phản hồi w/o của 201 cho các yêu cầu HEAD và 200 của w/cho GET.

+0

Tôi đang ở trên 1.9.2 và Rails 3.1.4 ... Tôi hoàn toàn chuẩn bị để làm điều gì đó sai trái. Tôi sẽ phải điều tra thêm ... Cảm ơn. –

+0

Vì vậy, tôi nghĩ câu trả lời thực sự là các đường ray buộc yêu cầu HEAD thông qua cùng một hành động xử lý GET là b/c nó phải tạo ra ETag. Nếu HEAD đã làm một cái gì đó khác nhau, nó sẽ (có khả năng) phá vỡ bộ đệm ẩn phía máy khách. Như vậy, các cuộc gọi chính xác phải được phát hành .... Tôi không thích điều đó tôi thực sự không thể sử dụng đầu? để biết đó là yêu cầu HEAD, nhưng tôi (nghĩ rằng tôi) hiểu lý do. –

4

Tôi gặp sự cố chính xác này. Nó chỉ ra rằng cho phép bộ nhớ đệm gây ra điều này. Tắt bộ nhớ đệm trong môi trường và #head của bạn? sẽ hoạt động như mong đợi.

Vấn đề là Rack :: Cache chuyển yêu cầu HEAD thành yêu cầu GET để chúng có thể được lưu vào bộ nhớ cache. Đây được cho là hành vi đúng, nhưng nó can thiệp vào ứng dụng của tôi.