2016-11-28 2 views
2

Некоторые из соглашений Grails для передачи данных от контроллера к представлению Я нахожу немного непрозрачным, несмотря на чтение документации. Несколько основные вопросы:Grails render v response - соглашения для передачи данных контроллеру

Вот некоторые вопросы:

1) в строительных лесах, созданные для управления 'лицом', действие индекса заканчивается

respond Person.list(params) model:[personCount: Person.count()] 

In в index.gsp, то список отображается в браузере, используя:

<f:table collection="${personList}" /> 

Мой вопрос в том, откуда взялась эта переменная personList? Или иначе, как результат работы Person.list (...) в контроллере появился в представлении с именем personList? Есть ли обобщать правило о том, если вы звоните

respond foo 

и Foo список, то он будет отображаться в контроллере под названием «fooList»?

2) Если вы можете предоставить объект контроллеру, просто произнеся «render foo», какова цель параметра модели? т.е. есть некоторая разница между

respond foo 

и

respond model:[foo: foo] 

Похоже, что оба будут доступны в окне просмотра с помощью "${foo}"

3) И, наконец, что такое краткое описание разницы между «отвечать» и «отображать»? Кажется, что они передают данные с контроллера на представление.

+0

Если у вас есть утешение, я также нахожу ответ очень загадочным, поскольку он делает внутреннюю магию, и вы действительно не знаете, что происходит или как использовать, если ваш случай не соответствует следующему примеру. Например. Я хочу ответить двумя объектами, и я не знаю, как это сделать, поскольку в документации говорится, что вы можете передавать только один объект в качестве параметра (+ параметр аргумента). Если вам нужно использовать параметр аргумента для передачи дополнительных объектов, или вместо объекта, если у вас их два, это путает. Я прочитал документацию для ответа и решил, что рендеринг сэкономит много времени на отладку –

+0

Интересно, что я написал сотни API JSON и тысячи контроллеров пользовательского интерфейса в Grails. У меня почти никогда не было ситуации, когда существует совпадение между методами контроллера API и выходом и методами контроллера UI, поэтому ответ не помог бы в моих случаях. –

ответ

1

Итак, в документации очень хорошо объясняются как respond, так и render и указывается разница между ними. В частности, вопросы, которые вы задали.

Однако я отвечу на них здесь все равно:

  1. При использовании respond он будет пытаться определить соответствующую модель имя переменной на основе типа. Итак, для вашего примера, поскольку Person.list() возвращает List, переменная модели становится personList, а в другом примере, если foo - это List, она становится fooList. Это объясняется в документации о respond (с конкретными примерами).
  2. respond и render отличаются тем, что respond пытается ответить наиболее подходящей моделью на основе заголовка accept (или расширения файла). Где, как render, вы можете более конкретно управлять визуализацией ответа независимо от заголовка accept (или расширения файла). Это также разъясняется в описании как в документации.
  3. краткого описания различий можно найти в описании как respond и render (из документации):

Ответ: Попытки вернуть наиболее подходящий тип для требуемого типа содержимого (задаются либо Accept заголовка или файл расширения)

и

Render: визуализировать различные формы ответов от простого текста ответы, просмотр и шаблоны.

Чтобы поместить это просто: «Использование respond, когда вы хотите, чтобы поддерживать различные типы типов реагирования и следовать соглашению Grails и использовать render, если вы хотите более конкретный элемент управления типа ответа

+0

Спасибо, Джошуа. Страница, которую я просматривал, была возвращена поиском Google для «Grails reply», который ссылается на документацию для версии 3.1.1, которая является довольно отрывочной. Новая страница значительно улучшена. – user1023110

0

. Мой вопрос, где же эта переменная personList взялось?

метод respond добавляет список Person модели и по умолчанию будет генерировать модель имя переменной п rom Person имя класса.