2009-08-30 2 views
8

Многие из доступных методов контроллера (цепь, вперед, перенаправление) взять карту, которая может включать в себя клавиши, такие как:Grails методы контроллера

  • ID
  • PARAMS
  • модели

Несколько вопросов о них:

  • Является ли «id» просто n псевдоним для параметра запроса с именем 'id'? Другими словами, существует ли какое-либо различие между:

chain(controller: "member", action: "showProfile", params: [id: memberId])

и

chain(controller: "member", action: "showProfile", id: memberId)

  • chain метод (возможно, среди других) позволяет перейти модель и/или Params (карта) от действия контроллера от A до B. Практически говоря, какая разница между передачей данных от действия A к B через параметры и карты моделей? Кроме того, если данные передаются на карте модели, как мне получить доступ к ней в действие контроллера B?

ответ

7

«id» поступает из записей UrlMappings, таких как «/ $ controller/$ action?/$ Id?» - см. http://docs.grails.org/latest/guide/single.html#urlmappings для использования.

Параметры являются параметрами запроса или формируют параметры сообщения, доступ к которым осуществляется в приложениях, отличных от Grails, с использованием параметра request.getParameter ('foo'), но в Grails он упрощен как «params.foo». Содержимое карты модели хранится в атрибутах «Запрос как», доступ к которым осуществляется в приложениях, отличных от Grails, с использованием «request.getAttribute (« foo »)», но упрощенном в Grails как «request.foo» или более типично доступ непосредственно в GSP, например. "$ {Foo}".

+1

Я взглянул на документы, и кажется, что идентификатор действительно является параметром запроса, т. Е.вы получите доступ к нему в контроллере с помощью 'params.id'. Согласуется ли это с вашим пониманием? –

9

Все, что сказал Берт, является правильным. Кроме того, причина, по которой вы хотите сделать цепочку (если у вас есть модель) или перенаправление (если у вас нет модели для сохранения), заключается в том, что оба этих метода возвращают ответ перенаправления 302 в браузер , Затем браузер знает, как запросить следующую страницу.

Тогда он имеет правильный url в заголовке для результирующей страницы, а не URL-адрес со страницы, на которой был исходный запрос.

Этот шаблон очень полезен после POST информации, поскольку он позволяет избежать всех проблем с закладок и повторной отправкой информации, если пользователь нажимает обновление на результирующей странице.

Ex: если вы сохраняете книгу и хотите отобразить страницу списка, если книга успешно сохранена. Если вы просто назовете «controller.list()» в своем методе, он покажет пользователю список книг, которые будут визуализированы, но строка url все равно скажет «.../book/save». Это не подходит для закладки или перезагрузки. Вместо этого вызов redirect/chain отправит ответ 302 браузеру, чтобы он попросил страницу «.../book/list», что он делает. Все ваши переменные (ваша модель и другие флеш-сообщения) находятся в области флэш-памяти, поэтому они по-прежнему доступны для вашей модели/представления для использования, и все в мире счастливо.

Этот шаблон называется Post/Redirect/Get.

Смежные вопросы