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.11AssetPipeline: 2.14.6

Другие вопросы по тегам