【问题标题】:Moving Grails logic from view to controller将 Grails 逻辑从视图移动到控制器
【发布时间】:2011-08-17 08:34:18
【问题描述】:

这个问题是问题here的延续。

下面的代码来自我的一个观点,它工作正常,但我很难将此代码移动到控制器。如果我的包和类从下面的代码中看不清楚,请看上一个问题,看看它们是如何排列的。

<g:set var="roleAdmin" value='${org.me.example.userrole.Role.findByAuthority("ROLE_ADMIN")}' />
<g:set var="roleOfficeProfessional" value='${org.me.example.userrole.Role.findByAuthority("ROLE_OFFICE_PROFESSIONAL")}' />
<g:set var="roleDriver" value='${org.me.example.userrole.Role.findByAuthority("ROLE_DRIVER")}' />
<g:select name="loggedBy.id" from="${org.me.example.userrole.UserRole.findAllByRoleInList([roleAdmin, roleOfficeProfessional, roleDriver]).user}" optionKey="id" value="${loadInstance?.loggedBy?.id}"  />   

这可能是我的一个基本误解,但我无法让我在控制器中创建的任何方法在我的视图中工作,只有 Grails 创建的方法(即listcreatedeleteedit 等)将起作用。任何帮助/建议都会有所帮助。

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    fromvalue 属性并非来自控制器中的方法/操作。它们通常来自请求对象。我在你的其他线程中给了你正确执行此操作的代码,但这里再次,稍微更详细...

    class SomeController {
    
       def show = {
         def loadInstance = whateverYouGetItFrom
         def users = UserRole.findAllByRoleInList([roleAdmin, roleOfficeProfessional, roleDriver]).user
         [loadInstance:loadInstance,users:users]
       }
    }
    

    然后你会有一个 show.gsp 包含

    <g:select name="loggedBy.id" from="${users}" optionKey="id" value="${loadInstance?.loggedBy?.id}"  />
    

    如果我误解了您的问题,请提供更多详细信息。

    【讨论】:

    • 格雷格的回答很到位。我要补充的唯一说明是注意 [loadInstance:loadInstance,users:user] 是将数据从控制器传递到视图的重要部分。这行代码表示将地图“返回”或传递给视图。它使地图中项目的内容可用于 gsp 中的 ${} 模板语法。抱歉,如果这是重复或过于简单的解释,但似乎这就是造成混乱的原因。
    • @Bill Pfeiffer 不,欢迎解释。我在业余时间学习 Grails/Groovy,休息了 2 个月,忘记了很多东西。格雷格的回答让我大吃一惊。我认为optionKey="id" 参数会产生错误,我仍然不清楚value 参数实际上在做什么......但我可以阅读这两个。我唯一的另一个问题是如何将参数从视图传递到控制器?我了解控制器的 [key:value] 部分,但是当我使用 from="${users}" 时如何将参数传递给控制器​​?
    • 为什么需要将视图中的某些内容传递给控制器​​来填充 SELECT?
    • 假设我将此代码移动到服务中,以便可以在不同的控制器中重新使用它。因为我有 5 种不同的角色类型,即 120 种可能的角色组合,每一种都需要一个自己的闭包。如果我可以传入一个参数或参数(在这种情况下可能是 5 个),我只需要一个闭包。我是否遗漏了一些关于它应该如何工作的东西?
    • 我认为你的逻辑是错误的,事实上我们错过了一大块拼图,因为我们不知道你在这里真正想要实现什么。当您透露更多信息时,我们只能拼凑起来。在这一点上我只能说确定哪些用户传递给视图的逻辑应该发生在控制器中,而不是视图中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多