Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grails setting values in Select (dropdown menu) for a boolean

Tags:

grails

groovy

I'm using the Grails framework. In my User controller, I have a boolean field named "active" which controls if users are allowed to login. The login action checks this value when the user is logging in.

My domain:

class User {
  Boolean active
}

My view (edit.gsp):

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

The value saves correctly into the database, but I want the Account Status dropdown to say "Enabled" or "Disabled", instead of "1" or "0" as it does now.

It also should show the current value when the Edit page is loaded. Currently, it always shows the value of "1", even if the user has the value of "0" in the database.

This seems like it would be very easy, but I haven't been able to find any examples of anyone setting their dropdown values in the GSP, and nothing I've tried so far is working. Thanks!

like image 237
Jon B. Avatar asked Dec 04 '22 15:12

Jon B.


1 Answers

I see two solutions, both in the documentation.

One is to us the keys parameter of the tag:

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

This provides a different list of keys vs the list of values.


The other solution is to use the optionKey and/or optionValue parameters, but this is would would require the list to contain objects or something similar that could be used to look up the values:

In 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 }
}

In your view:

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

Now the tag is looking up the key based on a bean property of the items in the list. Also, an enum might work here, too.


Obviously the first technique is cleaner for short lists, but I wanted to show both options for more complex situations. I haven't tested the second example, either.

One more note: You will probably find that the keys 0 and 1 don't really work, because Disabled will not get selected (in my experience) if the value is false. I don't know if you can get away with using true and false, but you should test to make sure you are getting what you expect.


There's actually a third option, probably the most robust solution, also in the docs:

Use the valueMessagePrefix parameter to allow the displayed value to be looked up from the i18n messages.

In grails-app/i18n/messages.groovy:

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

In your view:

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

This has the additional benefit of allowing you to have different labels for different languages, if you ever need it.

like image 54
OverZealous Avatar answered Dec 11 '22 10:12

OverZealous