Я сделал скрипт, который загружает контент на основе текущей локали запроса. Что-то типа
class ScriptsTagLib {
static namespace = "my"
def loadLangInfo = { attrs ->
Locale locale = RequestContextUtils.getLocale(request)
r.script() {
out << '$(function(){ loadLangInfo("'+locale.language+'") });'
}
}
}
Если я добавлю это в свой макет, страница выдаст ошибку:
Ошибка оценки выражения [my.loadLangInfo()] в строке [6]: невозможно добавить модуль [-page-fragments-], который требует размещения [defer] для этого запроса — это расположение уже было обработано.
Ошибка 19 ноября 2012 г., 15:13:54,801 [http-bio-8080-exec-5] ОШИБКА [Tomcat].[localhost] — ErrorPage обработки исключений [код ошибки = 500, location =/grails-errorhandler] Сообщение: java. io.UnsupportedEncodingException: кодировка символов [null] не поддерживается
Но если я добавлю этот тег на свою страницу вместо макета, страница будет отображаться успешно.
Нельзя добавить r.script()
в макет?
EDIT: Проблема действительно с ресурсами в макете. Другой пример, который терпит неудачу:
<g:layoutHead/>
<r:script>
$(function(){ });
</r:script>
<r:layoutResources />
EDIT 2: дополнительная информация о контексте
- Грааль 2.0.4
- Ресурсы 1.2.RC2
Кроме того, это макет внутри плагина, а не одного приложения.
Не тестировался в Grails 2.1, но сделает это.
ИЗМЕНИТЬ 3:
Только что протестировано с Grails 2.1.1
и Grails 2.0.4
новыми свежими проектами плагинов, и тег script в макете игнорируется!
./views/layout/test.gsp -> Сценарий игнорируется
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><g:layoutTitle default="Insoft4 UI Plugin"/></title>
<g:layoutHead/>
<r:layoutResources />
</head>
<body>
<g:layoutBody/>
<r:script disposition="defer">
alert('layout!');
</r:script>
<r:layoutResources />
</body>
</html>
./views/index.gsp -> Сценарий в порядке
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Teste</title>
<meta name="layout" content="teste" />
<r:script disposition="defer">
alert('index!');
</r:script>
<r:layoutResources />
</head>
<body>
<h1>Testing this index!</h1>
<r:layoutResources />
</body>
</html>