Считывание значения g:DatePicker в Grails без использования метода “новый объект (параметры)”
-
22-08-2019 - |
Вопрос
Допустим, у меня есть средство выбора даты под названием "foobar".:
<g:datePicker name="foobar" value="${new Date()}" precision="day" />
Как мне прочитать отправленное значение этого средства выбора даты?
Одним из способов, который работает, но имеет некоторые нежелательные побочные эффекты, является следующий:
def newObject = new SomeClassName(params)
println "value=" + newObject.foobar
Этот способ выполнения считывает все отправленные поля в newObject, чего я хочу избежать.Меня интересует только значение поля "foobar".
Изначально я предполагал, что это можно было бы сделать следующим образом:
def newObject = new SomeClassName()
newObject.foobar = params["foobar"]
Но Grails, похоже, не выполняет автоматический перевод поля foobar в объект Date().
Обновленный: Дополнительную информацию можно найти в Граали ДЖИРЫ.
Решение 2
Чтение значения g: DatePicker стало намного проще в Grails 1.2 (см. примечания к выпуску):
Лучший анализ дат
Если вы отправляете дату из тега, получение объекта Date теперь так же просто, как поиск его из объекта params по имени (например.параметры.foo )
Другие советы
Используйте командный объект идиома.В случае вашего примера я предположу, что ваша форма вызывает действие handleDate
.Внутри контроллера:
def handleDate = { FoobarDateCommand dateCommand ->
def theNextDay = dateCommand.foobar + 1
}
Вот FoobarDateCommand
.Обратите внимание, как вы называете поле так же, как в представлении:
class FoobarDateCommand {
Date foobar
}
Командные объекты - это удобный способ инкапсулировать все задачи проверки для каждой из ваших форм, сохраняя ваши контроллеры красивыми и маленькими.
Когда параметр называется "struct", это означает, что существует несколько параметров, представляющих его значение.В вашем случае существуют:
- параметры[год хранения "foobar_year"
- параметры["foobar_month"] месяц хранения
- параметры["foobar_day"] день хранения
Просто достань их и делай все, что захочешь :)
Однако вам все равно нужно знать формат
def newObject = new SomeClassName()
newObject.foobar = Date.parse('yyyy-MM-dd', params.foobar)