Подтвердить что ты не робот

Доступ к изображениям на производстве, с 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 в моем представлении и установкой некоторых глобалов, но я ищу хорошее решение этой проблемы, если оно существует.

Любая помощь приветствуется, спасибо.

4b9b3361

Ответ 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') %>";