Как настроить Rails для доступа к мультимедийному ресурсу, который не находится в его обычном каталоге?
-
06-07-2019 - |
Вопрос
Допустим, у меня есть изображение, которое не находится в обычном месте:
{appname}/public/images/unconventional.gif
Но вместо этого здесь:
{appname}/unconventional.gif
Я понимаю, что это полное нарушение конвенций Rails, это аморально, и вы никогда не должны делать этого ни при каких обстоятельствах, и, более того, зачем мне вообще предлагать такую глупость?
Хорошо, теперь, когда с этим покончено, предполагая, что я нахожусь в Windows и, следовательно, о символических ссылках не может быть и речи, как это можно настроить?
Решение
Rails не обслуживает эти изображения, он позволяет это делать веб-серверу.Вам лучше всего изменить конфигурацию вашего веб-сервера, чтобы справиться с этим сценарием.Если вы используете Apache
, например, его было бы довольно легко настроить с помощью mod_rewrite
.
Заставлять Rails обслуживать эти изображения будет некрасиво, но это является возможно, если вы укажете маршрут в своем routes.rb
это соответствует /public/images/unconventional.gif
, и если сам файл не существует.Например:
map.connect "public/images/unconventional.gif",
:controller => "static_image_controller",
:action => "serve"
А затем создайте контроллер 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
Предупреждение: если вы используете описанную выше концепцию, обратите внимание, что если вы используете входные данные из URL-адреса, чтобы решить, какой файл обслуживать (с params[:file]
, например), вам необходимо тщательно очистите входные данные, потому что вы рискуете выставить всю свою файловую систему напоказ внешнему миру.