These gists are used to showcase how GORM composition works.They are included in one of my blog posts (http://zakirtariverdiev.blogspot.com/2014/02/making-grails-gorm-composition-work.html). Repo with a complete working example can be found here on GitHub at this URL: https://github.com/zakirt/gorm-composition-example
Last active
August 29, 2015 13:55
-
-
Save zakirt/8765247 to your computer and use it in GitHub Desktop.
Grails GORM composition.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%@ 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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%@ 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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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