Ресурсы Rails: как вы можете ссылаться на изображения из другого приложения?

Rails добавляет хэш md5 к именам изображений при перемещении их в каталог /public/assets во время прекомпиляции. Проблема в том, что эти хэши непредсказуемы, так как я могу узнать, как они будут называться при попытке связать их?

Например, если я размещаю изображение с именем flowers.jpg, а затем пытаюсь получить к нему доступ по адресу www.mysite.com/flowers.jpg, это не удается, поскольку файл был переименован в flowers-4182172ae014ec23dc02739229c08dcc.

Я знаю, что у Rails есть помощники, которые автоматически найдут эти изображения. Но что, если вы пытаетесь сделать ссылку на эти изображения с совершенно другого веб-сайта или приложения? Есть ли способ заставить Rails сказать: «Ну, я не могу найти предварительно скомпилированную версию flowers.jpg, поэтому вместо того, чтобы обслуживать из /public/assets, я буду обслуживать из /app/assets»?

РЕДАКТИРОВАТЬ: Согласно этому сообщению (http://stackoverflow.com/questions/10045892/rails-compiles-assets-both-with-and-without-md5-hash-why), Rails должен компилировать версию моих активов как с хешем md5 и БЕЗ него? Есть идеи, почему моя копия Rails не генерирует версию без отпечатка пальца?


person NudeCanalTroll    schedule 18.04.2012    source источник


Ответы (2)


Rails справится с этим за вас, используя image_tag:

image_tag "myimage.jpg"

и это даст вам правильный URL для него. Возможно, вы сможете написать небольшой сервис, который генерирует URL-адрес изображения для вашего as (непроверенный):

Class AssetsService < ApplicationController  
  def index
  end
end

index.js.haml

= image_tag "myimage.jpg"
person Tam    schedule 18.04.2012

Ответ был не с Rails. Я не думаю, что Rails должен компилировать изображения без отпечатка пальца. Однако предполагается, что он по-прежнему сможет их обслуживать, и я добавил некоторый код в свой файл конфигурации nginx, который предотвратил это. Это был оскорбительный код:

location ~* ^/assets/ {
    # Per RFC2616 - 1 year maximum expiry
    # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
    expires 1y;
    add_header Cache-Control public;

    # Some browsers still send conditional-GET requests if there's a
    # Last-Modified header or an ETag header even if they haven't
    # reached the expiry date sent in the Expires header.
    add_header Last-Modified "";
    add_header ETag "";
    break;
}
person NudeCanalTroll    schedule 18.04.2012