Grails выберите не устанавливать значение по умолчанию

#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:

Пара вещей.

  1. Если избранное — это объект с идентификатором, вам потребуется значение =»$ {favorite.id }»
  2. Вы могли бы просто использовать значение =»${person.favorite.id }»

Комментарии:

1. Я добавил значение =»${favorite?.id }», но даже тогда, когда я возвращаюсь на страницу (после перехода к другому контроллеру), у нее нет предварительно выбранного значения избранного, хотя я могу убедиться, что оно было успешно сохранено в БД и передано в представлениеотлично.

2. Глупый вопрос, но содержит ли teenageMutantNinjaTurtleInstanceList те же объекты, которые используются для person.favorite? Кроме того, вы переопределили свой метод equals() в своем домене для избранного?

3. Вы также можете попробовать использовать атрибуты optionKey и OptionValue, чтобы увидеть, имеет ли это значение.

4. Нет. Строковые значения возвращаются нормально. Это не имеет абсолютно никакого смысла. Установка атрибута value в teenageMutantNinjaTurtleInstanceList[2] работает. Установка его равным teenageMutantNinjaTurtleInstanceList.each { it == избранное} этого не делает, хотя я могу убедиться, что избранное отображается правильно. (>_<)

5. Что вы имеете в виду строковые значения? Это созданные вами объекты или просто строки? Можете ли вы отредактировать свой вопрос и показать свой домен TeenageMutantNinjaTurtle?