Каков «правильный» способ справиться с несоответствием между моделью, контроллером и представлением в Grails? - PullRequest
0 голосов
/ 22 апреля 2011

Конечно, может случиться так, что мой первый проект Grails представляет сумасшедшее несоответствие между моей моделью данных и презентацией, которую хотят дизайнеры пользовательского интерфейса.

Вот упрощенная формулировка пространства задач:

В продуктовом магазине три ингредиента: морковь, сельдерей и помидоры. Целью приложения является сохранение списка покупок пользователя: сколько из каждого купить.

Веб-дизайнеры хотят сделать это с помощью нескольких вариантов HTML SELECT, поэтому вы выбираете из выпадающего списка, какой ингредиент вы хотите купить, а затем введите количество рядом с ним. Если вы хотите больше ингредиентов, вы нажимаете на ссылку JavaScript, которая добавляет больше SELECTs.

В дизайне указано, что каждый раскрывающийся список одинаков и количество строк не ограничено. Таким образом, вы можете получить обратно форму, которая имеет 5 строк, соответствующих 3 моркови, 9 сельдерея, 2 сельдерея, 5 моркови и 1 помидор.

Из этого я «должен» произвести заказ на 8 морковок, 11 сельдереев и один помидор.

Не вдаваясь во все аргументы о том, почему это плохой дизайн пользовательского интерфейса, я хочу на практике понять, как сопоставить модель / контроллер с представлением с учетом такого несоответствия, как для отправки, так и для окончательного редактирования сохраненной отправки. .

Моя первоначальная идея:

  • Для входящих данных создайте свежую карту в Контроллере из параметров и некоторой логики, чтобы правильно сложить значения в три новые пары ключ / значение, передав эту новую карту в метод bindData вместо самой карты параметров запроса. ,
  • Чтобы представить представление для редактирования, используйте afterInterceptor, чтобы переписать эту часть модели в правильное число этих SELECT, признавая, что мой исходный 5-строчный порядок станет тремя строками, когда он будет представлен для редактирования.

Однако, когда я читаю об объектах Command, мне интересно, будет ли это лучше.

Я прочитал много страниц в Интернете, но не вижу решений для такого несоответствия MVC.

Отбросив очевидный ответ (сразитесь с дизайнерами), каков способ Grails для этого?

1 Ответ

0 голосов
/ 23 апреля 2011

Я думаю, что ваша первоначальная идея должна работать. Командный объект было бы неплохо перенести логику построения доменных объектов из методов контроллера, но не НЕОБХОДИМО. Это может привести к более легкому чтению кода и некоторой упрощенной проверке, если вы когда-нибудь добавите больше информации в свой список покупок (имя, дата и т. Д.). Но что-то без объекта cmd должно работать, и я не думаю, что это будет неправильно ...

GSP:

<g:form .......>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
</g:form>

Контроллер:

def saveCart = {
  def shoppingList = [:]
  def ingredients = params.list('ingredient')
  def amounts = params.list('amount')

  ingredients.eachWithIndex() { obj, i ->
     if (shoppingList.containsKey(obj)) {
       shoppingList[obj] = shoppingList[obj] + amounts[i]
     } else {
       shoppingList[obj] = amt[i]
     }
  }

  // shoppingListshould have everything you need now
  ....
  ....
}
...