Как настроить Rails для доступа к мультимедийному ресурсу, который не находится в его обычном каталоге?

StackOverflow https://stackoverflow.com/questions/1029442

Вопрос

Допустим, у меня есть изображение, которое не находится в обычном месте:

{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], например), вам необходимо тщательно очистите входные данные, потому что вы рискуете выставить всю свою файловую систему напоказ внешнему миру.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top