Como Rails ser configurado para acessar um recurso de mídia que não está na sua localização diretório convencional?
-
06-07-2019 - |
Pergunta
Vamos dizer que eu tenho uma imagem que não reside no local normal:
{appname}/public/images/unconventional.gif
Mas, em vez aqui:
{appname}/unconventional.gif
Eu entendo isso é uma violação completa das convenções Rails, é imoral e você nunca deve fazer isso em qualquer circunstância e, além disso, por que eu iria mesmo sugerir uma coisa tão tola?
Ok, agora que temos que fora do caminho, supondo que eu estou no Windows e ligações, portanto, simbólicos estão fora de questão, como é possível configurá-lo?
Solução
Rails não servem essas imagens, ele permite que o servidor web fazer isso. Você teve melhor alterar a configuração do seu servidor web para lidar com esse cenário. Se você usar Apache
, por exemplo, seria bastante fácil de configurar com mod_rewrite
.
Fazendo Rails servem essas imagens vão ser feio, mas é é possível se você fornecer uma rota na sua routes.rb
que partidas /public/images/unconventional.gif
, e se o arquivo não existe. Por exemplo:
map.connect "public/images/unconventional.gif",
:controller => "static_image_controller",
:action => "serve"
E, em seguida, criar um StaticImageController
controlador:
class StaticImageController < ApplicationController
def serve
image = File.read(File.join(Rails.root, "unconventional.gif"))
send_data image, :type => "image/gif", :disposition => "inline"
end
end
Aviso: se você usar o conceito acima, nota que se você usar a entrada do URL para decidir qual arquivo para servir (com params[:file]
, por exemplo), você precisa completamente higienizar a entrada, porque você está arriscando expor o seu sistema de arquivos inteiro para o mundo exterior.