4

Grailsフレームワークを使用しています。ユーザーコントローラーには、ユーザーがログインを許可されるかどうかを制御する「active」という名前のブールフィールドがあります。ログインアクションは、ユーザーがログインしているときにこの値をチェックします。

私のドメイン:

class User {
  Boolean active
}

私の見解(edit.gsp):

<g:select id="active" name="active" from="${[1,0]}" value="${userInstance?.active}" />

値はデータベースに正しく保存されますが、[アカウントステータス]ドロップダウンに、現在のように「1」または「0」ではなく、「有効」または「無効」と表示させたいです。

また、編集ページがロードされたときの現在の値も表示されます。現在、ユーザーがデータベースで「0」の値を持っている場合でも、常に「1」の値が表示されます。

これは非常に簡単なようですが、GSPでドロップダウン値を設定している人の例を見つけることができず、これまで試したことは何も機能していません。ありがとう!

4

3 に答える 3

11

ドキュメントに2つの解決策があります。

1つはkeys、タグのパラメーターです。

<g:select id="active" name="active" from="${['Enabled','Disabled']}" keys="${[1,0]}" value="${userInstance?.active}" />

これにより、キーのリストと値のリストが異なります。


もう1つの解決策は、optionKeyおよび/またはoptionValueパラメーターを使用することですが、これには、値を検索するために使用できるオブジェクトまたは同様のものをリストに含める必要があります。

src/groovy/BooleanSelectOption.groovy

class BooleanSelectOption {
    String name
    String value
    private BooleanSelectOption(name, value) {
        this.name = name
        this.value = value
    }
    private static List _list;
    public static List getList() {
        if(!BooleanSelectOption._list) {
            BooleanSelectOption._list = [new BooleanSelectOption('Enabled',1), new BooleanSelectOption('Disabled',2)]
        }
        BooleanSelectOption._list
    }
    public String toString() { name }
}

あなたの見解では:

<g:select id="active" name="active" from="${BooleanSelectOption.list}" optionKey="value" value="${userInstance?.active}" />

これで、タグはリスト内のアイテムのBeanプロパティに基づいてキーを検索しています。また、enumここでも機能する可能性があります。


明らかに、最初の手法は短いリストの方がクリーンですが、より複雑な状況では両方のオプションを示したかったのです。2番目の例もテストしていません。

もう1つの注意:値が。の場合、(私の経験では)選択されない0ため、キー1が実際には機能しないことに気付くでしょう。とを使用して問題を解決できるかどうかはわかりませんが、期待どおりの結果が得られていることを確認するためにテストする必要があります。Disabledfalsetruefalse


実際には、ドキュメントにも3番目のオプション、おそらく最も堅牢なソリューションがあります。

このvalueMessagePrefixパラメーターを使用して、表示された値をi18nメッセージから検索できるようにします。

grails-app/i18n/messages.groovy

boolean.select.0=Disabled
boolean.select.1=Enabled

あなたの見解では:

<g:select id="active" name="active" from="${[1,0]}" value="${userInstance?.active}" valueMessagePrefix="boolean.select" />

これには、必要に応じて、言語ごとに異なるラベルを付けることができるという追加の利点があります。

于 2012-06-14T19:24:57.733 に答える
4

キーと値のオブジェクトプロパティまたはマップ値を使用optionKeyできます。optionValue次のようなものを試してください。

<g:select name="active" optionKey="key" optionValue="value"
 from="${[[key: 1, value: 'Enabled'],[key: 0, value: 'Disabled']]}"/>
于 2012-06-14T19:25:55.023 に答える
1

このような場合の代替案として、タスクが保証するよりもはるかに多くの処理が必要になるのと同じように、単純な古いhtmlにフォールバックすることができます。例えば

<select name="active">
 <option value="0" ${!active ? 'selected' : ''}>Disabled</option>
 <option value="1" ${active ? 'selected' : ''}>Enabled</option>
</select>
于 2012-06-15T14:06:03.550 に答える