Grails 圣杯<;g:选择>;悲哀

Grails 圣杯<;g:选择>;悲哀,grails,groovy,Grails,Groovy,我在用电脑。默认情况下,这个插件在我的项目中创建了三个类 org.me.example.UserRole.UserRole org.me.example.UserRole.User org.me.example.UserRole.Role User和Role类彼此不知道,但是UserRole类既有User又有Role对象。角色对象只有一个属性,一个名为权限的字符串 我的目标是在语句中获得具有特定权限的所有用户 以下是我的一个尝试: <g:select name="loggedBy.id"

我在用电脑。默认情况下,这个插件在我的项目中创建了三个类

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

User
Role
类彼此不知道,但是
UserRole
类既有
User
又有
Role
对象。
角色
对象只有一个属性,一个名为
权限
的字符串

我的目标是在
语句中获得具有特定
权限的所有
用户

以下是我的一个尝试:

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



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

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

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

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

<g:select from="${usersWithAdminRole}" name="loggedBy.id" optionKey="id" />
def usersWithAdminRole=UserRole.withCriteria{
eq(“角色”,role.findByAuthority(“角色\管理”))
}.收集{
it.user
}

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

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

<g:select from="${usersWithAdminRole}" name="loggedBy.id" optionKey="id" />
def usersWithAdminRole=UserRole.withCriteria{
eq(“角色”,role.findByAuthority(“角色\管理”))
}.收集{
it.user
}
  • 您的包名不符合通用java标准:包名应该/必须以小写字符开头。否则人们会感到困惑,它可能是一个类(其中
    UserRole
    UserRole
    的嵌套类)
  • 基本上,您的代码片段很好(从概念上讲)。请注意,不能在双引号属性值中使用双引号!我想这已经阻止了你的进步。您可以尝试以下操作:

    <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实例访问用户实例是一个groovy任务。有关一些示例,请参见

  • 您的包名不符合通用java标准:包名应该/必须以小写字符开头。否则人们会感到困惑,它可能是一个类(其中
    UserRole
    UserRole
    的嵌套类)
  • 基本上,您的代码片段很好(从概念上讲)。请注意,不能在双引号属性值中使用双引号!我想这已经阻止了你的进步。您可以尝试以下操作:

    <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实例访问用户实例是一个groovy任务。有关一些示例,请参见


  • thx,我是Grails的新手。我曾尝试过类似的方法,但从控制器到视图的过程中遇到了问题。你能详细介绍一下吗。假设我不想将此闭包仅限于
    ROLE\u ADMIN
    ,而是想使闭包
    usersWithUserRole
    ,然后传入一个参数。我知道闭包接受带有此符号的参数
    ->
    ,但如何将该参数输入到
    标记?将其从控制器获取到视图只需将其放入请求中即可。[usersWithAdminRole:usersWithAdminRole]。至于让它为任何角色工作,只需创建一个使用我向您展示的标准代码的新方法,并将您想要的任何角色传递给该方法即可。所以“ROLE_ADMIN”就变成了someRoleVar.thx,我是Grails的新手。我曾尝试过类似的方法,但从控制器到视图的过程中遇到了问题。你能详细介绍一下吗。假设我不想将此闭包仅限于
    ROLE\u ADMIN
    ,而是想使闭包
    usersWithUserRole
    ,然后传入一个参数。我知道闭包接受带有此符号的参数
    ->
    ,但如何将该参数输入到
    标记?将其从控制器获取到视图只需将其放入请求中即可。[usersWithAdminRole:usersWithAdminRole]。至于让它为任何角色工作,只需创建一个使用我向您展示的标准代码的新方法,并将您想要的任何角色传递给该方法即可。所以“ROLE_ADMIN”变成了someRoleVar。我确实了解包的命名约定,但当我安装Spring Security Core插件时,它会自动创建包和其中的类,所以我没有弄乱名称。起初,我对你的代码有一些问题,但经过一些修改后,我使它正常工作了。请参阅我的最新问题。谢谢你的帮助。还有一个问题,克鲁多夫,我怎么能做同样的事情,但有多个角色。例如,检索角色为
    role\u ADMIN
    和/或
    role\u DRIVER
    的所有用户?有多种解决方案。。但是,我认为现在应该将逻辑移到控制器中:
    def desiredRole1=UserRole.findByAuthority(“ROLE\u ADMIN”);def desiredRole2=UserRole.findByAuthority(“角色驱动程序”);def listedUsers=UserRole.withCriteria{role{“in”(“id“,[desiredRole1.id,desiredRole2.id])}.list().user;[listedUsers:listedUsers]
    现在您可以在select的from属性中使用
    listedUsers
    。我肯定遗漏了一些简单的内容,因为正如我在对@Gregg的评论中所说,我在从
    用户角色
    控制器获取信息到视图时遇到了问题。您提供的代码没有错误,但我视图中的下拉框为空。不确定我在这方面做错了什么,但在我看来,当我使用
    findAllByRoleInList([desiredRole1,desiredRole2])
    时,确实得到了预期的结果。。。但是如果像你和Gregg所说的那样把它放在控制器中,那就太好了。我确实意识到了包的命名约定,但是当我安装SpringSecurity核心插件时,它会自动创建包和clas
    <g:set var="desiredRole" 
        value='${org.me.example.UserRole.findByAuthority("ROLE_ADMIN")}' />
    
    <g:select name="userSelect" 
        from="${org.me.example.UserRole.findAllByRole(desiredRole).user}" />