2009-06-22 6 views
2

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

{appname}/public/images/unconventional.gif 

Но вместо того, чтобы здесь:

{appname}/unconventional.gif 

Я понимаю, что это полное нарушение Rails конвенций, является аморальным, и вы никогда не следует делать это ни при каких обстоятельствах и, кроме того, почему я даже предлагаю такую ​​глупость?

Хорошо, теперь, когда у нас это есть, предположим, что я нахожусь в Windows, и поэтому на символических ссылках не может быть и речи, как это можно настроить?

ответ

6

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

 Смежные вопросы

  • Нет связанных вопросов^_^