2015-02-02 4 views
0

У меня есть пользователь домена, у которого есть много очередей. Добавление и отображение очередей работает нормально, но когда я удаляю очередь от пользователя, очередь удаляется, но все же отображается в браузере. Вид обновляется только после выхода из системы и входа в систему.Объект домена Grails не обновляется в gsp

Где я удалить их:

def user = session?.user 
    def queue = Queue.findById(params.queueId) 

    if(queue){ 
     user.removeFromQueues(queue) 
     queue.delete(flush:true) 

     flash.message = "deleted queue with id: ${queue.id}" 
     redirect(controller:'queue', action:'index') 
    } 

И отображается таким образом:

<g:each in="${session?.user?.queues}"> 
     <div id="queue"> 
      ${it.name} id:${it.id} 
       <div id='queueButtons'> 
        <g:hiddenField name="queueId" value="${it.id}" /> 
        <g:link controller='queue' action='delete' params="[queueId: "${it.id}"]">X</g:link> 
       </div> 
     </div> 
    </g:each> 

Почему пользователь не обновляется? Когда я добавляю очередь пользователю, она отображается немедленно. Есть ли способ обновить пользователя/сеанс?

+3

потому что вы сохраняете пользователя в сеансе. Это очень-очень-очень плохая идея. – Koloritnij

ответ

1

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

Ваш пользовательский экземпляр в сеансе не подключен к сеансу hibernate, поэтому он не обновляется.

Редизайн/Рефакторинг кода, чтобы сохранить только голый минимум информации в сеансе (идентификатор пользователя - хорошая идея) и перейти оттуда. Вы вызываете больше проблем для себя, чем вы решаете, пытаясь вложить слишком много в сессию, и все будет ухудшаться, если вы продолжите этот путь.

+0

Хорошо, это кажется логичным. Но как мне получить доступ к домену пользователя из gsp, если у меня есть только идентификатор пользователя? Должен ли я получать пользователя из gsp, или из javascript, или как-то еще? Какая здесь самая лучшая практика? – lxknvlk

+0

Как правило, вы будете делать это с помощью библиотеки тегов, так как вы можете внедрить службу в библиотеку тегов, и служба может искать пользователя и использовать любые свойства из домена для визуализации любого результата (например, «Добро пожаловать обратно $ {имя пользователя]), которое вы хотите , Это довольно распространенная картина. –

+0

Я реорганизовал все, и теперь это работает. Я не получил домен из gsp, я сделал это в контроллере с session.userId и передал необходимые параметры в переменной сеанса. – lxknvlk