2013-08-02 2 views
1

Мне нужно программно загрузить список. Вместо:Заполнение списка в g.select

<g:select 
     name="cars" 
     from="${Car.list()}" 
     value="${person?.cars*.id}" 
     optionKey="id" 
     multiple="true" /> 

Я хотел бы сделать это, потому что это список не всегда приходит из того же источника

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

От не нагружает. со списком, я получаю сообщение об ошибке:

Нет подписи метода:. sample.SearchTagLib $() применяется для типов аргументов: (sample.SearchTagLib $ _getSelectField_closure5) значения: [[email protected]] Возможные решения: is (java.lang.Object), any(), use ([Ljava.lang.Object;), any (groovy.lang.Closure), wait(), grep()

ответ

1

Вам не нужно ${} в from опции

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

В Groovy кода ${} способ поставить Groovy выражения в двойных кавычках GStrings, если вы не в GSTRING вы можете просто использовать выражение непосредственно, без упаковки его в ${}.


Редактировать из вашего комментария

fieldFrom на данный момент является строка, которая будет получить его значение из базы данных. Таким образом, значение в БД является «Car.list()», которое в прототипе мне нужно преобразовать в связанную или исполняемую строку кода.

Обычно не рекомендуется, чтобы ваше приложение выполняло произвольные фрагменты кода Groovy, предоставленные пользователями (по очевидным соображениям безопасности). Пока фрагменты код поступают из безопасного источника, такого как доверенный пользователь с правами администратора, то достаточно справедливым, можно с помощью GroovyShell

def from = new GroovyShell().evaluate(searchfield.fieldFrom) 

, но это, вероятно, будет весьма неэффективны, создавая новый загрузчик классов и синтаксический анализ и компиляции весь класс скриптов Groovy каждый раз. Если значения fieldFrom предназначены для того, чтобы всегда извлекать что-то из базы данных (т. Е. Они всегда будут чем-то вроде Car.list() или Vehicle.findAllByNumberOfWheelsGreaterThan(2), а не произвольным Groovy, например [1,2,3]), тогда было бы лучше хранить выражения HQL в fieldFrom и запускать их с помощью executeQuery

def from = AnyDomainClass.executeQuery(searchfield.fieldFrom) 

(executeQuery статический метод GORM, вам нужно вызвать его на определенный класс домена, но он может возвращать результаты любого типа). HQL эквивалент Car.list() будет «from Car», эквивалент Vehicle.findAllByNumberOfWheelsGreaterThan(2) будет «from Vehicle where numberOfWheels > 2» и т.д.

+0

делание не приводит к ошибке, он анализирует значение как строку, но если searchfield.fieldFrom = Car.list() Я бы хотел, чтобы он получил список доступных автомобилей. Это будет приводиться в таблицу для пользователя – user2498465

+0

@ user2498465, это именно то, что он должен делать. Что такое 'searchField' и как его настроить? –

+0

Поле В этой точке находится строка, которая получит свое значение из базы данных. Таким образом, значение в БД является «Car.list()», которое в прототипе мне нужно преобразовать в связанную или исполняемую строку кода. – user2498465

1

Я думаю, вы необходимо использовать строки в качестве имени атрибута:

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