在g.select中填充列表

在g.select中填充列表,select,grails,Select,Grails,我需要以编程方式加载列表。 而不是: <g:select name="cars" from="${Car.list()}" value="${person?.cars*.id}" optionKey="id" multiple="true" /> “发件人”未加载。通过列表,我收到一条错误消息: 没有方法的签名:sample.SearchTagLib.$()适用于参数类型:(sample.SearchTa

我需要以编程方式加载列表。 而不是:

<g:select 
       name="cars" 
       from="${Car.list()}" 
       value="${person?.cars*.id}" 
       optionKey="id"
       multiple="true" />
“发件人”未加载。通过列表,我收到一条错误消息:


没有方法的签名:sample.SearchTagLib.$()适用于参数类型:(sample.SearchTagLib$\u getSelectField\u closure5)值:[sample.SearchTagLib$\u getSelectField]_closure5@1187b50]可能的解决方案:is(java.lang.Object)、any()、use([Ljava.lang.Object;)、any(groovy.lang.Closure)、wait()、grep()我认为您需要使用字符串作为属性名:

g.select('name' : searchfield.fieldName,                          
         'class' : "fillWidth searchfield",
         'multiple' : "true",
         'from' : ${ searchfield.fieldFrom },
         'optionKey' : searchfield.fieldKey,
         'optionValue' : searchfield.fieldValue)

from
选项中不需要
${}

g.select(name : searchfield.fieldName,                          
         class : "fillWidth searchfield",
         multiple : "true",
         from : searchfield.fieldFrom,
         optionKey : searchfield.fieldKey,
         optionValue : searchfield.fieldValue)
在Groovy代码中,
${}
是一种将Groovy表达式放在双引号GString中的方法,如果您不在GString中,您可以直接使用表达式,而无需将其包装在
${}


编辑您的评论中的


此时的fieldFrom是一个字符串,可以从数据库中获取其值。因此,DB中的值是“Car.list()”,在原型中,我需要将其转换为可绑定或可执行的代码行

通常不建议允许您的应用程序执行用户提供的任意Groovy代码片段(出于明显的安全原因)。只要代码片段来自一个安全的来源,如可信的管理员用户,那么使用
GroovyShell

def from = new GroovyShell().evaluate(searchfield.fieldFrom)
但是这可能会非常低效,每次创建一个新的类加载器并解析和编译整个Groovy脚本类或
车辆。查找大于(2)
,而不是像
[1,2,3]
那样的任意Groovy的HQL表达式,那么最好将HQL表达式存储在
字段中,并使用
executeQuery运行它们

def from = AnyDomainClass.executeQuery(searchfield.fieldFrom)

executeQuery
是一个静态GORM方法,您需要在特定的域类上调用它,但它可以返回任何类型的结果。)
Car.list()
的HQL等价物将是“
from Car
”,等价物将是
Vehicle.findallbynumberofheelsgener(2)
来自车辆,其中numberOfWheels>2
”,等等。

这样做不会产生错误,它会像字符串一样解析值,但如果searchfield.fieldFrom=Car.list()我想让它得到可用汽车的清单。这将是一张桌子上的汽车user@user2498465这正是它应该做的。什么是
searchField
以及如何设置它?此时的fieldFrom是一个字符串,可以从数据库中获取其值。因此数据库中的值是“Car.list()“在原型中,我需要将其转换为可绑定或可执行的代码行。@user2498465我明白了,我添加了一些可能的建议。感谢GroovyShell的工作,该列表来自一个安全的源代码。谢谢。”
def from = AnyDomainClass.executeQuery(searchfield.fieldFrom)