Grails <g:select> woes </g:select>

时间:2011-08-15 18:56:43

标签: grails groovy

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

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

UserRole类彼此不了解,但UserRole类同时包含UserRole对象。 Role对象只有一个属性,一个名为authority的字符串。

我的目标是在Users声明中获取具有特定authority的所有<g:select>

以下是我的一次尝试:

<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的回答对我有用。 Crudof指出包名UserRole不遵循Java包命名约定。这是真的,但是如果我没记错的话,Spring Security Core插件会自动创建该包及其中的类,所以我没有弄乱这个名字......但是我已经有一段时间了,所以我可以被误认为是自动命名包裹。

<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=""  />

2 个答案:

答案 0 :(得分:2)

最好在控制器中执行此操作:

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

<g:select from="${usersWithAdminRole}" name="loggedBy.id" optionKey="id" />

答案 1 :(得分:2)

  1. 您的软件包名称不符合常见的Java标准:软件包名称应该/必须以小写字符开头。否则一个人会感到困惑,它可能是一个类(其中UserRoleUserRole的嵌套类。)
  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