コントローラーに複数の選択変数を投稿しています。複数選択が機能する方法は、選択された値が1つしかない場合は単一の文字列として渡され、複数の値が選択された場合はString []として渡されることです。処理をシンプルに保ち、渡された値を同じように扱いたいです。したがって、私ができる最善の方法は、次のようにリストに変換することです。
def selectedValues = params.selectedValues
List valuelist = new ArrayList()
if(selectedValues instanceof String) {
valuelist.add(selectedValues)
} else {
valuelist = selectedValues as List
}
それは機能しますが、これを行うためのよりグルーヴィーな方法があるかどうか、おそらく1つのライナーで興味があります:)。
もちろん、私が単純に行う場合:
List valuelist = selectedValues as List
たとえば24から[2,4]に変換されるため、選択した1つの値では機能しません。
何か案は?
Flattenを使用してそれを取得できます。
def toList(value) {
[value].flatten().findAll { it != null }
}
assert( ["foo"] == toList("foo") )
assert( ["foo", "bar"] == toList(["foo", "bar"]) )
assert( [] == toList([]) )
assert( [] == toList(null) )
または、別のメソッドが必要ない場合は、1つのライナーとして実行できます。
[params.selectedValues].flatten().findAll{ it != null }
私は個人的に2つのメソッドを記述し、型システムにそれを処理させます。
def toList(String value) {
return [value]
}
def toList(value) {
value ?: []
}
assert( ["foo"] == toList("foo") )
assert( ["foo", "bar"] == toList(["foo", "bar"]) )
assert( [] == toList([]) )
assert( [] == toList(null) )
それはより効率的で、何が起こっているのかもう少し明白だと思います。
最新のGrailsでは、params.list('xxx')
を使用するだけです。
これを試して:
def valueList = []
valueList = valueList + params?.selectedValues
更新: nullケースをどのようにするかに応じて、他のいくつかのオプション。 Tedが指摘したように、上記のソリューションは、params?.selectedValuesがnullの場合に[null]を返しますが、これは希望どおりではない可能性があります。
// if you want null to return []
def valueList = [] + (params?.selectedValues ?: [])
または
// if you want null to return null
def valueList = params?.selectedValues ? ([] + params?.selectedValues) : null