2013-06-05 5 views
0

У меня есть простая проблема. Мне нужно управлять коллекцией hasMany на объекте домена. Я думал, что делаю это правильно, но это не сработало. Я нашел еще один пост, но она очень устарела и не работает (Handling parameters from dynamic form for one-to-many relationships in grails)Как управлять отношением друг к другу - grails

class User{ 
    static hasMany = ['prefs': Preference] 
} 
class Preference{ 
    Boolean email 
    Boolean site 
    Date dateCreated 
    Date lastUpdated 

} 

GSP

<g:each var="t" in="${user.prefs}" status="idx">    
    <li> 
    <input type='hidden' name="prefs[${idx}].id" value="${t.id}"/> 
    Email: <g:checkBox name="prefs[${idx}].email" value="${t.email}" /> 
    Site: <g:checkBox name="prefs[${idx}].site" value="${t.site}" />< 
    </li> 
</g:each> 

Контроллер:

log.info(user.prefs) 
user.properties = params 
if(!user.save()){ ... } 

Это то ошибки из:

UserController - [Предпочтение: 3, предпочтение: 4]
Ошибка 2013-06-04 21: 54: 41,405 [HTTP-био-8080-Exec-12] ОШИБКА errors.GrailsExceptionResolver

IndexOutOfBoundsException произошел при обработке запроса: [POST]/пользователь/Prefs - параметры: префы [0] .EMAIL:
ID: 2
префы [1] .Выходные: на
префов [0] .EMAIL: на
_prefs [1] .Выходные:
_prefs [1] .EMAIL:
prefs [1] .id: 3
_prefs [0] .site:
p рефов [0] .Выходные: на
префов [0] .id: 4
индекс: 1, размер: 1. StackTrace следующим образом:
сообщение: Индекс: 1, размер: 1


+0

Не удалось ли сохранить пользователя после установки свойств?журналы для 'user.prefs' никогда не показывали' id' 1 и 2. Можете ли вы показать код контроллера и URL-адрес POST? BTW, если вас беспокоит конкретный порядок, который должен быть показан в gsp, добавьте «List prefs» в домене «Пользователь». Добавление 'prefs' в качестве элементов в список в' User' поддерживает индекс. – dmahapatro

+0

Журналы для user.prefs показывают 'UserController - [Предпочтения: 3, Предпочтения: 4]', которые, как оказалось, являются двумя назначенными. Его не показывает idx, и он показывает ключ surroget. – Nix

+0

Можем ли мы взглянуть на действие контроллера? – dmahapatro

ответ

0

Так что я решил это исправить, и это был гибридный подход. @Meam был прав, это была проблема с заказом, но вместо того, чтобы беспокоиться о заказе, я просто использовал подход @dmahapatro и установил Preference как список. Обратите внимание, что определение List preference должно соответствовать определению static hasMany. Или вы получите случайную ошибку при попытке создать пользователя. И, наконец, когда вы изначально настроить отношения, вы должны использовать addTo, чтобы связать два ...

class User{ 
    List preference 
    static hasMany = ['prefs': Preference] 
} 

//another thing I did not know in order to originaly link 
//the two when using lists, you have to use addTo... 
user.addToPrefs(
    new Preference(email: true, site:false) 
) 

Последнее, что я хотел бы упомянуть, это есть ошибка в <g:checkbox> если вы используете его с hasMany, как я это не сработает, если вы попытаетесь снять флажок. Я смог обойти это, выполнив код из github за FormTagLib. И затем обновил код с другим сообщением, которое я читал https://stackoverflow.com/a/2942667/256793, у которого есть решение, но оно немного устарело. Итак, вот обновленная версия:

//old code 
//out << "<input type=\"hidden\" name=\"_${name}\"" 
//new... 
def begin = name.lastIndexOf('.') +1 
def tail = name.substring(begin); 
out << "<input type=\"hidden\" name=\"${name.replace( tail, "_" + tail )}\" " 
1

Я нашел эту проблему несколько дней назад. И потратил 2 дня, чтобы исправить это.

Вы должны убедиться, что индекс детей в параметрах упорядочен так же, как объект родителя. В этом случае порядок детей [Предпочтение: 3, Предпочтение: 4]. Но порядок params - prefs [0] .id = 4, prefs [1] .id = 3. Порядок отличается.

Мне нужно переупорядочить индекс детей в параметрах, прежде чем связывать их.

+0

Вы правы, должен быть лучший способ сделать это. Шахта преуспевает, когда они находятся в правильном порядке, но терпят неудачу, если они не являются. Похоже, что это случайная сортировка my by updateDate. – Nix

Смежные вопросы