1

リストをプログラムでロードする必要があります。それ以外の:

<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)

from が読み込まれません。リストを使用すると、次のエラー メッセージが表示されます。

メソッドの署名なし: sample.SearchTagLib.$() は引数の型に適用できます: (sample.SearchTagLib$_getSelectField_closure5) 値: [sample.SearchTagLib$_getSelectField_closure5@1187b50] 可能な解決策: is(java.lang.Object), any( )、use([Ljava.lang.Object;)、any(groovy.lang.Closure)、wait()、grep()

4

2 に答える 2

1

オプションの${}は必要ありません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 スクリプト クラス全体を解析してコンパイルします。fieldFrom値が常にデータベースから何かを取得することを意図している場合 (つまり、それらは常に任意の Groovy のようなものではなく、 or のようなものになります) 、Car.list()HQL式を格納して、Vehicle.findAllByNumberOfWheelsGreaterThan(2)[1,2,3]fieldFromexecuteQuery

def from = AnyDomainClass.executeQuery(searchfield.fieldFrom)

(executeQueryは静的 GORM メソッドです。特定のドメイン クラスで呼び出す必要がありますが、任意の型の結果を返すことができます)。HQL に相当するものはCar.list()" from Car"、相当するものはVehicle.findAllByNumberOfWheelsGreaterThan(2)" from Vehicle where numberOfWheels > 2" などです。

于 2013-08-02T16:39:56.397 に答える