Доступ к изображениям на производстве, с javascript, в Rails 4
Похоже, что теперь в Rails 4, использующем конвейер ресурсов и жгут звездочки, при обработке изображений их имя файла добавляется с помощью отпечатка md5, такого как css и javascript. Хотя это имеет смысл, потому что md5 отпечатки пальцев являются удивительными, становится все труднее получить доступ к этому изображению из javascript. В rails 3.2 я мог получить доступ к изображению с помощью /assets/image_name.jpg
, и он будет работать правильно, но в рельсах 4 этот актив не существует, он существует только с отпечатком пальца md5 в имени.
Я знаю, что рельсы предоставляют помощникам доступ к изображению через erb <%= asset-url("image_name.jpg") %>
, но это не так идеально подходит для javascript, потому что я не использую erb в js. Есть много способов, с помощью которых я мог бы взломать это с атрибутами данных, служащими в представлениях, или с помощью тега script в моем представлении и установкой некоторых глобалов, но я ищу хорошее решение этой проблемы, если оно существует.
Любая помощь приветствуется, спасибо.
Ответы
Ответ 1
Другой вариант рассмотрения (хотя я бы не рекомендовал его) - использовать настраиваемый маршрут в вашем контроллере приложений для захвата пути активов для вас в контроллере и либо вернуть URL-адрес ресурсу с помощью хеша md5, либо, возможно, просто визуализируйте необработанные двоичные данные актива (хотя это добавит накладные расходы на обработку вашего приложения).
Например, вы получаете запрос AJAX на запрос
http://yourapp.com/images?file=my_image.jpg
Затем в вашем контроллере ваш метод действия будет выглядеть следующим образом:
def images
ActionController::Base.helpers.asset_url(params[:file])
end
Затем будет возвращен URL-адрес ресурса. Недостатком этого метода является то, что он требует, чтобы вы делали два запроса на стороне JS. Первый, чтобы получить путь к активу, а второй - фактически загрузить этот актив с возвращенным путем.
Чтобы уменьшить это до одного запроса, вы можете заставить приложение считывать изображение из файловой системы и возвращать соответствующие заголовки, чтобы браузер считал, что это изображение, которое возвращается, и для этого предоставит url. Тем не менее, это будет намного больше работы для приложения и намного более ненужного дискового ввода-вывода на вашем сервере.
Для каждого изображения на клиенте может потребоваться два запроса для достижения того, чего вы хотите, но вы должны где-то жертвовать...
Ответ 2
Зачем вам нужно использовать конвейер для изображений? Я получаю поведение хэширования. Но обычно активы будут предварительно обработаны. Если вы поместите изображения в общедоступную иерархию, как в старые времена, вы получите обычную маршрутизацию маршрута.
Здесь приведена цитата из Asset Pipleline, которая, я думаю, может быть родной.
"Активы по-прежнему могут быть размещены в публичной иерархии. Любые активы, находящиеся под публикой, будут обслуживаться как статические файлы приложением или веб-сервером. Вы должны использовать приложение/активы для файлов, которые должны пройти предварительную обработку, прежде чем они будут обслуживаться".
Ответ 3
К сожалению, я думаю, что вы застряли либо добавили расширение ERB в JS, либо использовали помощники активов, либо не использовали конвейер активов для активов.
Ответ 4
Когда вы говорите: "Я не использую erb в моих js", вы имеете в виду, что не хотите, или просто, что это не так? Потому что вы можете!
Если вы переименуете соответствующие JS файлы с расширением .js.erb
, вы можете использовать вспомогательный asset_url
в этих файлах так:
var src = "<%= asset_url('photo.jpg') %>";