Ресурсы Grails: нельзя добавить r.script в макет?

Я сделал скрипт, который загружает контент на основе текущей локали запроса. Что-то типа

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>

person Community    schedule 19.11.2012    source источник


Ответы (2)


Я обнаружил, что проблема возникает, когда вы объявили <r:layoutResources /> как в макете, так и на странице, и пытаетесь добавить скрипт в макет.

Чтобы исправить это, я удалил layoutResources из каждого вида, оставив только макет.

person Community    schedule 29.11.2012

Попробуйте добавить тег перед последним r:layoutResources в макете.

person Sergei Shushkevich    schedule 19.11.2012
comment
loadLangInfo — это просто функция javascript. Проблема с ресурсами, см. мое редактирование. - person ; 20.11.2012
comment
Тогда где и как определяется/добавляется модуль фрагментов страниц? - person Sergei Shushkevich; 20.11.2012
comment
Фрагменты страниц — это имя, используемое ресурсами для кода скрипта, который вы добавляете в r:script, у меня нет модуля с таким именем. Также обновил вопрос с моими тестами, кажется, что скрипты в макете плагина игнорируются ресурсами... - person ; 22.11.2012