Тег g: include не передает модель в представление правильно - PullRequest
0 голосов
/ 06 ноября 2011

Я боролся с этим уже несколько часов и пришел к выводу, что это может быть ошибкой в ​​2.0.0.RC1.

Сначала я думал, что это проект, над которым я работаю, но затем я создал совершенно новый проект и смог воссоздать ошибку. Пользуюсь Граалем 2.0.0.RC1.

Ошибка появляется, когда я пытаюсь включить объект модели в GSP, например:

/ привет / index.gsp

 <p>This data is coming from the model:</p>
 <p>content: ${content}</p>
 <g:include model="${otherModel}" view="/hello/include.gsp" />

Теперь в моем действии есть что-то вроде:

HelloController.groovy

package helloworld

class HelloController {

        def index() {

    def model = [:]
    model.content = 'content...'

    def includeModel = [:]
    includeModel.content = 'includeModel...'

    model.otherModel = includeModel

    render( view:'index', model:model )
    }
}

Файл /hello/include.gsp содержит следующее:

/ привет / include.gsp

<p>This data is coming from the included model:</p>
<p>content: ${content}</p>

Но на странице отображается не то, что я ожидаю, это то, что отображается на странице:

http://localhost:8080/helloworld/hello/index

This data is coming from the model:
content: content...
This data is coming from the included model:
content: content...

Есть идеи? Любая помощь с благодарностью.

Спасибо, -Cesar

1 Ответ

2 голосов
/ 07 ноября 2011

Это может быть ошибкой, но, согласно документации, тег include специально разработан для включения ответа другого контроллера / действия или представления в текущий ответ, а не только дополнительных GSP.Если вы хотите «включить» другой GSP на свою страницу, вам действительно следует использовать тег render.Я убедился, что ваш код корректно работает с тегом рендеринга и переименовывает include.gsp в _include.gsp, а также делает тег <g:render model="${otherModel}" template="include" />.Я получил следующий вывод:

Эти данные поступают из модели:

content: content ...

Использование g: render: Эти данные поступаютиз включенной модели:

content: includeModel ...

Я также попытался добавить еще одно действие в контроллер, чтобы вернуть включенный контент и выполнить рендеринг include.gsp, а затем с помощьюg: включить тег для вывода, что на странице, и это работает:

def include() {
    def includeModel = [:]
    includeModel.content = 'includeModel...'
    includeModel      
}

А затем в index.gsp я добавил:

<g:include action="include"/>

И я получил:

Эти данные поступают из модели:

content: content ...

Использование g: render: Эти данные поступают из включенной модели:

content: includeModel ...

Использование g: include с действием. Эти данные поступают из включенной модели:

content: includeModel ...

Такжевам не нужно указывать render (view: 'viewname, ...) в вашем контроллере, если представление совпадает с именем метода в контроллере.Вы можете просто вернуть модель, и Grails автоматически выберет файл GSP с тем же именем, что и действие контроллера.

При этом все равно кажется, что вы пытаетесь сделать с тегом includeдолжен работать, и я не могу объяснить, почему это не так (а исходный код тега не отображается внизу документов, как это должно быть).Я бы порекомендовал заполнить JIRA, если тег рендеринга вам не подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...