Solicitudes HEAD HTTP en Rails 3

Actualmente, Rails 3 enruta una solicitud HEAD a la ruta GET correspondiente. ¿Hay una cabeza? método en la solicitud, pero devuelve falso y la solicitud actúa como una solicitud de obtención. ¿Puedo detectar si la solicitud es una solicitud HEAD?

Razonamiento: entiendo que una solicitud HEAD debe devolver EXACTAMENTE los mismos encabezados que la obtención, por lo que Rails quiere realizar la GET completa y luego eliminar el cuerpo. Sin embargo, puedo cumplir con esta solicitud sin emitir las mismas llamadas DB, etc. que haría GET. ¿Esto tiene sentido?

preguntado el 03 de mayo de 12 a las 21:05

Es posible que deba publicar algún código relevante. ¿La cabeza? El método debe devolver verdadero para las solicitudes HEAD (api.rubyonrails.org/classes/ActionDispatch/…) -

3 Respuestas

Tuve este problema exacto. Resulta que habilitar el almacenamiento en caché provoca esto. ¿Desactivar el almacenamiento en caché en su entorno y #head? funcionará como se esperaba.

El problema es que Rack::Cache convierte las solicitudes HEAD en solicitudes GET para que puedan almacenarse en caché. Podría decirse que este es el comportamiento correcto, pero interfirió con mi aplicación.

Respondido 26 Oct 13, 00:10

Puede utilizar el request.head? método para averiguar si es una solicitud HEAD:

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

Una vez que hayas determinado que lo es, también puedes usar el método head() del controlador en lugar del típico renderizado:

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

Entonces, simplemente verificaría request.head? antes de molestarse con las actividades de la base de datos. Entonces usa

head :ok, :custom_header => 'value'

contestado el 03 de mayo de 12 a las 21:05

Entonces, aquí hay una idea general con algunos más información Puede ver que HEAD se enruta a GET my Rails, momento en el que la solicitud dice que es un GET. ¿Probé la cabeza?, pero no puedo hacer que indique que es una solicitud HEAD. - Glenn Goodrich

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

Mmm. El método de controlador anterior funciona como esperaría en Ruby v1.9.3-p194 y Rails v3.2.3; 201's sin cuerpo de respuesta para las solicitudes HEAD y 200's con GET's.

contestado el 04 de mayo de 12 a las 18:05

Estoy en 1.9.2 y Rails 3.1.4... Estoy completamente preparado para estar haciendo algo mal. Tendré que investigar más... Gracias. - Glenn Goodrich

Entonces, creo que la respuesta real es que Rails fuerza la solicitud HEAD a través de la misma acción que maneja GET es porque tiene que generar el ETag. Si HEAD hiciera algo diferente, (probablemente) rompería el almacenamiento en caché del lado del cliente. Como tal, se deben emitir las llamadas exactas... No me gusta que realmente no pueda usar la cabeza. saber que es una solicitud HEAD, pero (creo que) entiendo el razonamiento. - Glenn Goodrich

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.