act:ualise | technology

agile software development, software quality, scaling, testing and other tech

handling multiple object instances within gsp forms

| 0 comments

I needed to handle multiple dynamic instances of the same type of validating object in a form within Grails.

Having searched Google and the lists for an out-of-the-box way, or plugin, or pending bug-fix, I found nothing that already provided this capability so ended up writing my own utility.

Given

Map params = [
    'chart1.size': '10',  // could also be 'chart_1.size' or 'chart_id1.size'
    'chart1.height': '100',
    'chart1.width': '200',
    'chart1.name': 'foo',
    'chart2.size': '9',
    'chart2.height': '109',
    'chart2.width': '209',
    'chart2.name': 'blah'
]

The utility function broke the flat structure of the submission into a map of maps, keyed on the id.

static def multiInstanceFormElementsMap = { String groupKey, Set entries ->
    Map perInstanceParams = [:]
    entries.each {
        def matcher = (it.key =~ /${groupKey}([\d+]).(\w+)/);
        if (matcher.matches()) {
            def instanceId = matcher[0][1]
            if (!perInstanceParams[instanceId]) perInstanceParams[instanceId] = [:]
            perInstanceParams[instanceId] [matcher[0][2]] = it.value
        }
    }
    return perInstanceParams
}

Usage:

Map result = ControllerUtil.multiInstanceFormElementsMap('chart',  params.entrySet())

Leave a Reply

Required fields are marked *.

*