Skip to content

Instantly share code, notes, and snippets.

@zakirt
Last active August 29, 2015 13:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zakirt/8765247 to your computer and use it in GitHub Desktop.
Save zakirt/8765247 to your computer and use it in GitHub Desktop.
Grails GORM composition.
package gorm.composition.example.model
/**
* @author zakir
*
* We'll use this class for our example of composition in GORM.
* It will be embedded inside User domain class and will serve
* as one of its properties.
* Note: making modification to this class while the app
* is running can cause program failure. The user/_form view
* will fail to recognize the Address class' properties.
*/
class Address {
String streetAddress
String state
String zipCode
static constraints = {
streetAddress(blank:false)
state(blank:false, inList:['AZ', 'NY', 'PA'])
zipCode(blank:false, matches:'[0-9]{5}')
}
/*
* We need this so that the address is properly displayed in views/user/show.gsp
*/
String toString() {
"$streetAddress $state, $zipCode"
}
}
<%@ page import="gorm.composition.example.User" %>
<%@ page import="gorm.composition.example.model.Address" %>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'userName', 'error')} required">
<label for="userName">
<g:message code="user.userName.label" default="User Name" />
<span class="required-indicator">*</span>
</label>
<g:textField name="userName" required="" value="${userInstance?.userName}"/>
</div>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'firstName', 'error')} required">
<label for="firstName">
<g:message code="user.firstName.label" default="First Name" />
<span class="required-indicator">*</span>
</label>
<g:textField name="firstName" required="" value="${userInstance?.firstName}"/>
</div>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'lastName', 'error')} required">
<label for="lastName">
<g:message code="user.lastName.label" default="Last Name" />
<span class="required-indicator">*</span>
</label>
<g:textField name="lastName" required="" value="${userInstance?.lastName}"/>
</div>
<fieldset class="embedded"><legend><g:message code="user.homeAddress.label" default="Home Address" /></legend>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'homeAddress.state', 'error')} required">
<label for="homeAddress.state">
<g:message code="user.homeAddress.state.label" default="State" />
<span class="required-indicator">*</span>
</label>
<g:select name="homeAddress.state" from="${Address.constraints.state.inList}" required="" value="${userInstance?.homeAddress?.state}" valueMessagePrefix="address.state"/>
</div>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'homeAddress.streetAddress', 'error')} required">
<label for="homeAddress.streetAddress">
<g:message code="user.homeAddress.streetAddress.label" default="Street Address" />
<span class="required-indicator">*</span>
</label>
<g:textField name="homeAddress.streetAddress" required="" value="${userInstance?.homeAddress?.streetAddress}"/>
</div>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'homeAddress.zipCode', 'error')} required">
<label for="homeAddress.zipCode">
<g:message code="user.homeAddress.zipCode.label" default="Zip Code" />
<span class="required-indicator">*</span>
</label>
<g:textField name="homeAddress.zipCode" pattern="${Address.constraints.zipCode.matches}" required="" value="${userInstance?.homeAddress?.zipCode}"/>
</div>
</fieldset>
<%@ page import="gorm.composition.example.User" %>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'userName', 'error')} required">
<label for="userName">
<g:message code="user.userName.label" default="User Name" />
<span class="required-indicator">*</span>
</label>
<g:textField name="userName" required="" value="${userInstance?.userName}"/>
</div>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'firstName', 'error')} required">
<label for="firstName">
<g:message code="user.firstName.label" default="First Name" />
<span class="required-indicator">*</span>
</label>
<g:textField name="firstName" required="" value="${userInstance?.firstName}"/>
</div>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'lastName', 'error')} required">
<label for="lastName">
<g:message code="user.lastName.label" default="Last Name" />
<span class="required-indicator">*</span>
</label>
<g:textField name="lastName" required="" value="${userInstance?.lastName}"/>
</div>
<fieldset class="embedded"><legend><g:message code="user.homeAddress.label" default="Home Address" /></legend>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'homeAddress.state', 'error')} required">
<label for="homeAddress.state">
<g:message code="user.homeAddress.state.label" default="State" />
<span class="required-indicator">*</span>
</label>
<g:select name="state" from="${addressInstance.constraints.state.inList}" required="" value="${addressInstance?.state}" valueMessagePrefix="address.state"/>
</div>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'homeAddress.streetAddress', 'error')} required">
<label for="homeAddress.streetAddress">
<g:message code="user.homeAddress.streetAddress.label" default="Street Address" />
<span class="required-indicator">*</span>
</label>
<g:textField name="streetAddress" required="" value="${addressInstance?.streetAddress}"/>
</div>
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'homeAddress.zipCode', 'error')} required">
<label for="homeAddress.zipCode">
<g:message code="user.homeAddress.zipCode.label" default="Zip Code" />
<span class="required-indicator">*</span>
</label>
<g:textField name="zipCode" pattern="${addressInstance.constraints.zipCode.matches}" required="" value="${addressInstance?.zipCode}"/>
</div>
</fieldset>
package gorm.composition.example
import gorm.composition.example.model.Address
class User {
String userName
String firstName
String lastName
Address homeAddress
static constraints = {
userName(blank:false, unique:true)
firstName(blank:false)
lastName(blank:false)
}
static embedded = ['homeAddress']
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment