#grails #gsp
#grails #gsp
Вопрос:
У меня есть приложение, в котором пользователи могут заполнить форму и сохранить некоторые предварительные настройки для быстрого повторного заполнения
Домен
class Person {
String name
TeenageMutantNinjaTurtle favorite
static constraints = {
name blank:false, unique:true
favorite nullable:true
}
@Override
public String toString() { name }
}
package tmnt
class TeenageMutantNinjaTurtle {
String name
String colorHeadband
static constraints = {
name inList:["Leonardo", "Donatello", "Raphael", "Michelangelo"]
colorHeadband inList:["blue", "purple", "red", "orange" ]
}
@Override
public String toString() { "${name}" }
}
Контроллер
class PersonController {
def choose = {
if(session.user) {
def person = Person.findByName(session.user.username)
[
teenageMutantNinjaTurtleInstanceList: TeenageMutantNinjaTurtle.list(),
person : person,
favorite : person.favorite
]
}
}
def pickFavoriteTurtle = { TurtleCommandObject tut ->
def turtle = tut.turtleName
def choice = TeenageMutantNinjaTurtle.findByName(turtle)
String message = "Turtle not chosen "
if(choice){
def person = Person.findByName(tut.personName)
person.favorite = choice
person.save()
message = "Made ${person}'s favorite turtle ${choice}"
}
else {
message = "could not find ${choice}"
}
render message
}
Вид
<div>
<h1>Hello ${person} </h1>
<g:form action="pickFavoriteTurtle">
<g:hiddenField name="personName" value="${person}" />
<g:select name="turtleName" from="${teenageMutantNinjaTurtleInstanceList}" value="${favorite}" />
<g:submitToRemote name="pickFavoriteTurtle"
url="[action:'pickFavoriteTurtle']"
value="Save your favorite turtle" />
</g:form>
</div>
Избранное никогда не становится первоначально выбранным значением, хотя я могу показать, что оно оценивает значение равно true, как описано в руководстве пользователя. Что дает?
Комментарии:
1. почему для поля «PersonName» установлено значение ${person}? Правильно ли заполняется это поле? Представление может выдавать ошибку и игнорировать заполнение поля выбора.
2. для привязки данных. Это поле заполняется правильно и не является проблемой.
Ответ №1:
Ответил Томас Лин в списке рассылки Grails:
Ваша жизнь была бы проще, если бы вы просто придерживались идентификаторов.
Установите optionKey равным идентификатору вашего объекта в теге.
значение = ‘${ favorite.id }’ теперь должно сработать.
Ответ №2:
Пара вещей.
- Если избранное — это объект с идентификатором, вам потребуется значение =»$ {favorite.id }»
- Вы могли бы просто использовать значение =»${person.favorite.id }»
Комментарии:
1. Я добавил значение =»${favorite?.id }», но даже тогда, когда я возвращаюсь на страницу (после перехода к другому контроллеру), у нее нет предварительно выбранного значения избранного, хотя я могу убедиться, что оно было успешно сохранено в БД и передано в представлениеотлично.
2. Глупый вопрос, но содержит ли teenageMutantNinjaTurtleInstanceList те же объекты, которые используются для person.favorite? Кроме того, вы переопределили свой метод equals() в своем домене для избранного?
3. Вы также можете попробовать использовать атрибуты optionKey и OptionValue, чтобы увидеть, имеет ли это значение.
4. Нет. Строковые значения возвращаются нормально. Это не имеет абсолютно никакого смысла. Установка атрибута value в teenageMutantNinjaTurtleInstanceList[2] работает. Установка его равным teenageMutantNinjaTurtleInstanceList.each { it == избранное} этого не делает, хотя я могу убедиться, что избранное отображается правильно. (>_<)
5. Что вы имеете в виду строковые значения? Это созданные вами объекты или просто строки? Можете ли вы отредактировать свой вопрос и показать свой домен TeenageMutantNinjaTurtle?