繁体   English   中英

Grails<g:select> 困境</g:select>

[英]Grails <g:select> woes

我正在使用Spring 安全插件 默认情况下,这个插件在我的项目中创建了三个类。

org.me.example.UserRole.UserRole org.me.example.UserRole.User org.me.example.UserRole.Role

UserRole类彼此不知道,但UserRole class 同时具有UserRole object。 Role object 只有一个属性,一个名为authority的字符串。

我的目标是在<g:select>语句中获得所有具有一定authorityUsers

这是我的尝试之一:

<g:select name="loggedBy.id" from="${org.me.example.UserRole.UserRole.list(fetch:[(role.authority):"ROLE_ADMIN"])}" optionKey="id" value=""  />

我确实意识到这将返回一个UserRole列表而不是一个User列表。 无论如何“加入”我的课程,以便我可以检索我想要的数据? 寻找最干净的解决方案。

更新:

我认为我的课程看起来有些混乱,所以这里是精简版。


class UserRole {

    User user
    Role role

    //more stuff

}

class Role {

    String authority

    //more stuff

}

class User {

    //lots of stuff, but nothing that links back to the Role class or the UserRole class

}

经过一些改动后,克鲁多夫的回答对我有用。 Crudof 指出 package 名称UserRole不遵循 Java package 命名约定。 这是真的,但如果我没记错的话,Spring 安全核心插件会自动创建 package 和其中的类,所以我没有弄乱这个名字......但自从我这样做已经有一段时间了,所以我可以误认为它自动命名为 package。

<g:set var="desiredRole" value='${org.me.example.UserRole.Role.findByAuthority("ROLE_ADMIN")}' />
<g:select name="loggedBy.id" from="${org.me.example.UserRole.UserRole.findAllByRole(desiredRole).user}" optionKey="id" value=""  />

最好在 controller 中执行此操作:

def usersWithAdminRole = UserRole.withCriteria {
  eq("role", Role.findByAuthority('ROLE_ADMIN'))
}.collect {
  it.user
}

<g:select from="${usersWithAdminRole}" name="loggedBy.id" optionKey="id" />
  1. 您的 package 名称不符合常见的 java 标准:package 名称应该/必须以小写字符开头。 否则会感到困惑,它可能是 class (其中UserRole是嵌套的 class 的UserRole )。
  2. 基本上你的代码片段很好(概念上)。 请注意,您不能在双引号属性值中使用双引号。 我认为这阻止了您的进步:您可以尝试以下方法:

     <g:set var="desiredRole" value='${org.me.example.UserRole.findByAuthority("ROLE_ADMIN")}' /> <g:select name="userSelect" from="${org.me.example.UserRole.findAllByRole(desiredRole).user}" />

    请注意,从 UserRole-instances 访问用户实例是一种常规操作。 有关一些示例,请参阅http://groovy.codehaus.org/Collections

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM