Grails Goodness: Using Closures for Select Value Rendering
To generate an HTML select
we can use the Grails tag <g:select .../>
. We use the optionValue
attribute to specify a specific property we want to be used as the value. But we can also define a closure for the optionValue
attribute to further customize the value that is shown to the user.
Suppose we have a simple domain class Book
with a couple of properties. We want to combine multiple properties as the text for the HTML select
options. In the following GSP we define first a <g:select .../>
tag where we simply use the title
property. In the next <g:select .../>
tag we use a closure to combine multiple properties.
We can also pass the closure as model property to the GSP from a controller. In a controller we define the transformation in a closure and pass it along to the GSP page. On the GSP we can use this closure as a value for the optionValue
attribute of the <g:select .../>
tag. The following GSP shows all three scenarios.
<%@ page import="com.mrhaki.grails.sample.Book" contentType="text/html;charset=UTF-8" %>
...
Select
Use title property of book for option values
Use closure for optionValue
Use bookOptionValueFormatter that is defined as variable on this page
Use bookFormatter that is passed as a model property from SampleController.
...
Here is a sample controller which passes the transformation to the GSP:
package com.mrhaki.grails.sample
class SampleController {
def index() {
final formatter = { book -> "$book.title (pages: $book.numberOfPages)" }
[bookFormatter: formatter]
}
}
When we run the application and open the page in a web browser we get the following HTML source:
...
Select
Use title property of book for option values
It The Stand
Use closure for optionValue
It - 0451169514 The Stand - 0307743683
Use bookOptionValueFormatter that is defined as variable on this page
It (0451169514, 1104) The Stand (0307743683, 1472)
Use bookFormatter that is passed as a model property from SampleController.
It (pages: 1104) The Stand (pages: 1472) ...
The optionKey
attribute also allows closures as arguments.
Code written with Grails 2.3.2.