【问题标题】:Grails domain object not refreshing in gspGrails域对象在gsp中不刷新
【发布时间】:2015-04-01 06:55:55
【问题描述】:

我有一个域用户,它有很多队列。添加和显示队列工作正常,但是当我从用户删除队列时,队列被删除,但仍显示在浏览器中。仅当我注销并再次登录时才会刷新视图。

我删除它们的位置:

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>

为什么用户没有刷新?当我向用户添加队列时,它会立即显示。有没有办法刷新用户/会话?

【问题讨论】:

  • 因为您将用户保存在会话中。这是非常非常非常糟糕的主意

标签: grails gsp grails-domain-class


【解决方案1】:

如 cmets 中所述,将用户域实例保留在会话中不仅是一个非常糟糕的主意,而且还是导致问题的原因。

您在会话中的用户实例未附加到休眠会话,因此未更新。

重新设计/重构您的代码以仅在会话中保留最少的信息(用户 ID 是个好主意)并从那里开始。你给自己带来的问题比你在课程中投入过多所解决的问题还要多,如果你继续沿着这条路走下去,事情只会变得更糟。

【讨论】:

  • 好吧,这似乎合乎逻辑。但是,如果我只存储了用户 ID,我如何从 gsp 访问用户域?我应该从 gsp、javascript 还是其他方式获取用户?这里的最佳做法是什么?
  • 通常您将使用标记库来执行此操作,因为您可以将服务注入标记库,并且服务可以查找用户并使用域中的任何属性来呈现任何输出(例如,欢迎回来${username}) 你想要的。这是很常见的模式。
  • 我已经重构了一切,现在它可以工作了。我没有从 gsp 获取域,我在控制器中使用 session.userId 进行了操作,并在会话变量中传递了所需的参数。
  • 约书亚,有人说如果我在会话中存储用户,我可以用一行重新附加它:user?.attach()。这会比我的方法更可取吗?目前我只在会话中存储 userId。
  • 不,不建议在会话中保留最低限度以外的任何内容。虽然您 /can/ 像这样从 HTTP 会话重新附加休眠实例,但您确实不应该这样做。你永远不应该在会话中保持超过最低限度。只保留 id 是正确的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2011-09-18
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多