2009-02-10 9 views
14

He trabajado en mi camino a través de una serie de interesantes problemas de enrutamiento, convirtiendo una URL de solicitud en un hash, etc., pero solo por curiosidad. ¿Hay alguna manera de decirle al sistema de enrutamiento que desea que todo lo que se encuentre bajo un cierto subpaso de URL se sirva literalmente, sin pasar por un controlador?Rieles: una ruta para servir activos estáticos (como .jpgs, etc.)

Por ejemplo, si tengo /home/me/public_html/rails_proj/images/foo.jpg, y .../rails_proj/images/other/bar.jpg, ¿puedo insertar una ruta que diga "cualquier cosa debajo"? las imágenes deberían servir como un objeto del tipo de mime predeterminado? "

Puede ser interesante.

Respuesta

15

Si coloca el directorio "images" en la carpeta "public" de la aplicación Rails (por ejemplo:/public/images /), no debería tener problemas con los tipos MIME a menos que su servidor web esté configurado incorrectamente .

De acuerdo con sus ejemplos, usted quiere el directorio de imágenes en la raíz de la aplicación. No creo que exista una manera de Rails de hacer que esas imágenes sean visibles, pero si realmente quisieras, podrías usar mod_rewrite para que funcione. Una vez más, correspondería al servidor web asegurarse de que las imágenes tuvieran el tipo MIME correcto.

+0

Estoy bien con mover imágenes a la carpeta pública. Voy a hacer un poco de búsqueda en Google: colocando activos todavía me está dando un "No hay coincidencias de ruta ............. con {: method =>: get} – Sniggerfardimungus

+1

El problema con la carpeta pública es Estaba intentando el url/public/... Deshice el uso explícito de/public/y funcionó muy bien. – Sniggerfardimungus

+0

Me parece que una de las razones para hacerlo directamente dentro de los rieles es para el caso en el que está ejecutando un desarrollo server as script/server. Dicho esto, ponerlos en público parece funcionar para mí. Siempre que recuerdo tener los archivos allí. :) (Vaya sobre por qué llegué a esta pregunta.) – lindes

6

Las cosas que se sirven fuera del directorio público no pasarán por Rails, solo serán manejadas por su servidor (probablemente apache). La única razón por la que necesitarías servir imágenes a través del sistema de rieles es si querías algún tipo de control sobre quién podría acceder a ellos. Sólo hay que poner todo lo demás en ala pública y de acceso:. siteurl.whatever/images/jpg *

+0

Me parece que la razón principal por la que uno querría que los rieles sirvan a la imagen directamente está en un servidor de desarrollo cuando se ejecuta simplemente como script/servidor. – lindes

1

Advertencia: si su URL de solicitud coincide con un WEBrick recurso estático, mestizo o lo estará feliz de servirla. A toda costa, no querrás que esté en producción: si tu tráfico es lo suficientemente alto, tu aplicación se pondrá de rodillas simplemente porque sus amigos estarán ocupados sirviendo contenido estático.

Así que asegúrese de que su servidor web esté configurado correctamente para todo tipo de contenido estático como lo han señalado los comentaristas anteriores.

5

Normalmente utilizo nginx como frontend y Apache/Passenger como back-end. Ngingx procesa todas las solicitudes de Rails a Apache pero maneja todo el contenido estático. Vea los ejemplos en the English nginx wiki. Aquí es un pequeño extracto de configuración nginx:

server { 
    listen 80; 
    server_name www.domain.com; 
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|js)$ { 
     root /path/to/static/assets/dir; 
    } 
    location/{ 
     proxy_pass http://127.0.0.1:81; 
    } 
} 

Así que tienen, Apache escucha en el puerto 81 para manejar peticiones como rieles aproximada por nginx y dejar nginx entregar el contenido estático. No solo se supone que nginx es más rápido que Apache para entregar contenido estático, sino que también descarga su aplicación Rails para cada imagen, hoja de estilo, javascript o cualquier otro contenido estático.

2

Creo que la forma más simple de resolver este problema es simplemente utilizando el método image_path helper, que le proporciona la ruta para la imagen que desea visualizar en la vista. Por ejemplo, si quiere referir un logo.png en /assets/images/logo.png, puede usar image_path ('logo.png').

Cuestiones relacionadas