UrlMappings для указания URL-адреса на файл конвейера активов в Grails
В Grails 3.0 как вы сопоставляете URL с файлом под assets
папка?
Например:http://localhost:8080/favicon.ico
-> grails-app/assets/images/bookmark.ico
Я пробовал несколько тестовых сопоставлений, таких как:
Grails-приложение / контроллеры / UrlMappings.groovy
class UrlMappings {
static mappings = {
...
"/t1.png" (uri: "/assets/images/test.png")
"/t2.png" (uri: "/assets/test.png")
"/t3.png" (uri: "/images/test.png")
"/t4.png" (dir: "assets/images", file: "test.png")
...
}
}
... но все они приводят к ошибке 500 сервера.
4 ответа
Я думаю, что вам нужно сопоставить URL-адрес с AssetController из Asset Plugin, как это (не проверено):
class UrlMappings {
static mappings = {
...
"/files/$id" (controller :"AssetController", action:"index")
...
}
}
НТН
Вот то, что я использовал, чтобы подать swfobject.js
на определенный URI:
Добавьте отображение URL:
"/swf/swfobject.js" (controller:"facerecorder", action:"swfobject")
Добавьте действие к контроллеру, который находит ресурс и обслуживает его. Обратите внимание, что assetResourceLocator
, который является частью конвейера активов, вводится в контроллер.
class FacerecorderController {
def assetResourceLocator
def swfobject() {
def resource = assetResourceLocator.findAssetForURI('swf/swfobject.js')
render file: resource.inputStream, contentType: 'text/javascript'
}
}
Это определенно не идеально, но это работает. Протестировано с использованием Grails 3.0.17
Если вы не используете конвейер активов, вы можете сопоставить статические ресурсы с URL-адресами, выполнив шаги, изложенные в документации Grails. Однако ваш вопрос заключается в том, как сопоставить один ресурс с одним URL с помощью плагина Asset-Pipeline.
Несколько лет назад Берт Беквит рассказал на форуме Grails о роли Grail в обслуживании статических ресурсов.
Grails не обслуживает статические ресурсы, контейнер делает. Поэтому нет способа напрямую настроить сопоставление - вам нужно обслужить его через контроллер или настроить прокси, как предлагает Эрик.
Burt
Этот ответ может быть неудовлетворительным. Но если вы должны обслуживать статический ресурс и абсолютно не хотите использовать контроллер или прокси, вы можете попробовать следующее.
Создайте представление с именем image.gsp. Представление будет содержать только тег актива. Используя ваши примеры выше,
<asset:image src="t1.png"/>
Затем настройте сопоставления URL-адресов так, чтобы они указывали на image.gsp
стр.
class UrlMappings {
static mappings = {
...
"/t1.png" (view: "image")
...
}
}
Я понимаю, что это не тот метод, который вы надеялись использовать. Но я думаю, что понимание роли, которую играет Grails по сравнению с контейнером, в котором работает Grails, поможет принять решение о том, как правильно обслуживать ресурс для пользователя.
Я знаю, что это может показаться не связанным, но если вы хотите создать страницу со списком содержимого каталога, ознакомьтесь с этой статьей CodePanda. Его код можно использовать в качестве шаблона для создания контроллера для обслуживания одного файла, и он объясняет, как обновить view, controller и groovy.config.
С помощью "/favicon.ico"(uri: "/assets/favicon.ico")
работает для меня.
Концептуально, похоже, что Asset Pipeline выравнивает активы (так что вам не нужно специализироваться images
, javascripts
, stylesheets
для uri
)
Grails: 3.2.11
AssetPipeline: 2.14.6