¿Cómo se configuran los Rails para acceder a un recurso de medios que no está en su ubicación de directorio convencional?
-
06-07-2019 - |
Pregunta
Digamos que tengo una imagen que no reside en la ubicación normal:
{appname}/public/images/unconventional.gif
Pero en cambio aquí:
{appname}/unconventional.gif
Entiendo que esto es una violación completa de las convenciones de Rails, es inmoral y nunca debes hacerlo bajo ninguna circunstancia y, además, ¿por qué te sugiero algo tan tonto?
Ok, ahora que tenemos eso fuera del camino, asumiendo que estoy en Windows y por lo tanto los enlaces simbólicos están fuera de la cuestión, ¿cómo es posible configurar esto?
Solución
Rails no sirve estas imágenes, permite que el servidor web lo haga. Es mejor que cambie la configuración de su servidor web para manejar este escenario. Si usa Apache
, por ejemplo, sería bastante fácil de configurar con mod_rewrite
.
Hacer que Rails sirva estas imágenes será feo, pero es posible si proporciona una ruta en su routes.rb
que coincida con / public / images / unconventional.gif
, y si el archivo en sí no existe. Por ejemplo:
map.connect "public/images/unconventional.gif",
:controller => "static_image_controller",
:action => "serve"
Y luego cree un controlador StaticImageController
:
class StaticImageController < ApplicationController
def serve
image = File.read(File.join(Rails.root, "unconventional.gif"))
send_data image, :type => "image/gif", :disposition => "inline"
end
end
Advertencia: si usa el concepto anterior, tenga en cuenta que si usa la entrada de la URL para decidir qué archivo servir (con params [: file]
, para ejemplo), necesita minuciosamente desinfectar la entrada, porque se arriesga a exponer todo su sistema de archivos al mundo exterior.