2012-05-03 18 views
6

Szyny 3 obecnie trasuje żądanie HEAD do pasującej trasy GET. Jest głowa? metoda na żądanie, ale w zwraca wartość false, a żądanie działa jak żądanie pobrania. Czy mogę wykryć, czy żądanie jest żądaniem HEAD?Żądania HTTP HEAD w Railsach 3

Powód: Dostaję, że żądanie HEAD powinno zwrócić EXACT samych nagłówków, co Rails, więc Rails chce wykonać pełny GET, a następnie ogolić ciało. Mogę jednak dostosować się do tego żądania bez wydawania tych samych wywołań DB itp., Które spowodowałoby żądanie GET. Czy to ma sens?

+0

Może być konieczne opublikowanie odpowiedniego kodu. Głowa? metoda powinna zwracać wartość true dla żądań HEAD (http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F) – rjk

Odpowiedz

2

Możesz użyć request.head? sposób, aby dowiedzieć się, czy jest to żądanie HEAD:

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

Po ustaleniu, że to jest, można także użyć głowy sterownika() metoda zamiast typowego render:

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

Po prostu sprawdzam request.head? przed zawracaniem głowy działaniami związanymi z bazą danych. Następnie użyj

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

A więc, oto sedno z niektórymi [więcej informacji] (https://gist.github.com/2594991) Możesz zobaczyć, że HEAD jest kierowany do GET my Rails, w którym to momencie żądanie mówi, że to GET. Próbowałem głowy ?, ale nie mogę tego uzyskać, aby wskazać, że jest to żądanie HEAD. –

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

Hmm. Powyższa metoda kontrolera działa tak, jak oczekiwałbym na Ruby v1.9.3-p194 i Rails v3.2.3; Ciało odpowiedzi 201 w/o dla żądań HEAD i 200 w/dla GET's.

+0

Jestem na wersji 1.9.2 i Rails 3.1.4 ... Jestem w pełni przygotowany na robienie czegoś złego. Będę musiał zbadać dalej ... Dzięki. –

+0

Tak więc, myślę, że prawdziwą odpowiedzią jest to, że szyny wymuszają żądanie HEAD przez tę samą akcję, która obsługuje GET, b/c musi generować ETag. Jeśli HEAD zrobiłby coś innego, (prawdopodobnie) zepsułoby buforowanie po stronie klienta. W związku z tym należy wysłać dokładne telefony ... Nie podoba mi się to, że nie mogę używać głowy? wiedzieć, że jest to wniosek HEAD, ale ja (myślę, że rozumiem) rozumowanie. –

4

Miałem ten dokładny problem. Okazuje się, że powoduje to włączenie buforowania. Wyłącz buforowanie w swoim środowisku i #head? będzie działać zgodnie z oczekiwaniami.

Problem polega na tym, że Rack :: Cache zamienia żądania HEAD na żądania GET, aby mogły być buforowane. Jest to prawdopodobnie poprawne zachowanie, ale ingerowało w moją aplikację.

Powiązane problemy