Grails визуализируют вид другого контроллера - PullRequest
3 голосов
/ 07 февраля 2012

Мой вопрос похож на следующий пост Отображение вида другого контроллера

У меня есть TestConfigController. Мой вопрос: что я могу сделать в случае сбоя проверки и хочу отобразить контроллер: test and view: редактировать вместо контроллера: testCOnfig и view: edit

def save() {

        def testConfigInstance = new TestConfig(params)
        if (!testConfigInstance.save(flush: true)) {

/ * Вместо просмотра: "edit" я хочу view: "/ test / edit" которыйне работает * /

            render(view:"edit",  model: [testConfigInstance: testConfigInstance],id:params.test.id)
            return
        }
        println "+++++++++++++++++++++++++"
        flash.message = message(code: 'Data successfully saved', args: [message(code: 'testConfig.label', default: 'Successfully saved')])
        redirect(action: "edit", controller:"test", id:params.test.id)
    }

Есть указатели?Я уже изучил перенаправление grails , которое не имеет параметра "модель" и, следовательно, не может передать ошибки проверки представлению. Также я рассмотрел рендер grails , который не имеетпараметр контроллера, так что я могу вернуться к другому контроллеру!Пожалуйста, дайте мне знать, если требуется более подробная информация / код

РЕДАКТИРОВАТЬ Следующее происходит при использовании одной из двух вещей

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance],id:params['test.id'])

Приведенный выше код отображает страницу / тест/ edit без ссылки на testid, в итоге выдает ошибку, говоря, что «test.id» не может быть нулевым .. (означает его рендеринг / test / edit, а не / test / edit / 1)

render(view:"/test/edit/"+params['test.id'],  model: [testConfigInstance: testConfigInstance],id:params['test.id'])

КодПриведенное выше приводит к следующей ошибке

The requested resource (/EasyTha/WEB-INF/grails-app/views/test/edit/1.jsp) is not available.

Любой из приведенных выше кодов не отображает просто «/ test / edit» без идентификатора в конце, что в итоге приводит к ошибке, говоря, что test.id не может быть нулевым.

Ответы [ 3 ]

7 голосов
/ 10 февраля 2012

Значение id, которое вы пытаетесь добавить в путь просмотра, должно быть частью карты модели.Значения, указанные в карте модели, доступны в отображаемом виде.

В первой выбранной вами опции параметр id не имеет никакого значения, поскольку метод рендеринга не использует параметр 'id' (метод redirect использует параметр id для генерации URL-адреса перенаправления).

Ваш фрагмент кода должен выглядеть примерно так:

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance, id:params['test.id']])

Используемый здесь метод рендеринга не перенаправляет вас на какое-то другое действие.render просто печатает проанализированное viewName в выходной поток.Например.render (view: "/ test / edit") просто отображает представление edit.gsp.На самом деле он не перенаправляет вас на действие редактирования тестового контроллера.Поэтому простая передача идентификатора в карте модели не даст вам доступа к testInstance в представлении.Вам нужно получить testInstance по идентификатору и передать его представлению на карте модели

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance, testInstance: Test.get(params['test.id'] as Long)])
5 голосов
/ 07 февраля 2012

Анудж Арора прав:

Если вы просто хотите визуализировать произвольное представление, вы можете использовать полный путь к представлению, связанному с папкой grails-app / view:

В вашемcase:

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance],id:params.test.id)

должно работать.

1 голос
/ 07 февраля 2012

Если вы хотите визуализировать только представление /test/edit, тогда все, что вам нужно - это вызов render(view:'/test/edit',...).

Если вместо этого вы также хотите включить часть обработки из TestController и edit, затем посмотрите на вызов chain().Он имеет параметр model, в который можно передавать ошибки проверки, и параметры controller/action для перенаправления на другой контроллер.

...