Grails 使用域对象字段创建视图

Grails 使用域对象字段创建视图,grails,Grails,我有以下域类 Address String number String roadName String country Person String fName String age Address address 我有一个名为PersonViewSave的视图,我希望用户能够从该视图中保存Person信息。创建个人记录时,用户还需要创建地址记录 我的个人控制器如下所示: PersonViewSave ={ def ad = new Address(number: '11', ro

我有以下域类

Address

String number
String roadName
String country

Person

String fName
String age
Address address
我有一个名为
PersonViewSave
的视图,我希望用户能够从该视图中保存
Person
信息。创建
个人
记录时,用户还需要创建
地址
记录

我的个人控制器如下所示:

PersonViewSave ={
    def ad = new Address(number: '11', roadName: 'round road', country:'France').save()
    new Person(fName: 'Alex', age: '23', address:ad).save()

}
1.)如何从视图中收集参数并将其带到
PersonViewSave
方法?(有人能给我看一个带有
Person
Address
文本字段的GSP视图示例文件吗)

2.)如果创建的地址有错误,我如何防止创建一个地址如下所示的Person对象
new Person(fName:'Alex',age:'23',Address:ad)。save()

更新

    <g:form name="myForm" method="post" action="doIt">
<p>Person info:</p>

<label for="firstName">First Name</label>
    <g:textField name="firstName" id="firstName" />




<p>Address Info:</p>

<label for="roadName">Street Number</label>
    <g:textField name="roadName" id="roadName" />


<g:submitButton name="submit" value="Submit" />
1.)我得到一个错误,它是>
没有这样的属性:class:pro.PersonService的params

2.)我有两个具有相同名称参数的域类。例如,
Animal
Person
域类有一个名为
firstName
的参数。根据您以前的解决方案,grail将如何区分它所属的域类


我正在使用Grails 2.2.4

以下是一种检查地址是否正确保存的方法:

def ad = new Address(params)
if (ad.save(flush: true)) {        
    def p = new Person(params)
    p.address = ad
    p.save()
} else {
    // display validation errors
}
如果正确保存,则返回
地址
,结果为
true
,否则返回
null
(或
false

此外,您还可以通过
params
map使用数据绑定从参数创建对象。只要
params
中的键与
Address
Person
类中的属性名称匹配,参数的值就会分配给对象

因此,例如,要映射您的
人员
,您需要以下字段:

<g:form name="personForm" method="post" action="PersonViewSave">
    <p>Person info:</p>

    <label for="fName">First Name</label>
        <g:textField name="fName" id="fName" />

    <label for="age">Age</label>
        <g:textField name="age" id="age" />


    <p>Address Info:</p>

    <label for="number">Street Number</label>
        <g:textField name="number" id="number" />

    <label for="roadName">Road</label>
        <g:textField name="roadName" id="roadName" />

    <label for="country">Country</label>
        <g:textField name="country" id="country" />

    <g:submitButton name="submit" value="Submit" />
</g:form>

个人信息:

名字 年龄 地址信息:

街道号码 道路 国家
您可以试试这个

def ad = new Address(number:params.number , roadName:params.roadName , country: params.country)
if (ad.save(flush: true)) {        
    def p = new Person(fName:params.fName , age: params.age, address:ad)
       p.save()
} else {
    // display validation errors
}

您可以使用
grails generate all
命令()将两个对象的控制器和视图显示出来,以查看默认的脚手架是如何工作的()您使用的是哪个版本的grails?我还希望在视图中显示
Address
字段。因此,用户可以在创建新的
人时创建新地址。那么我该怎么做呢?很简单,只需为Address的每个属性添加
g:textField
标记。让我编辑我的答案,告诉你我的意思。因为表单中这些字段的名称对应于Address和Person类中的属性名称,所以可以使用数据绑定来创建每个对象
def p=new Person(params)
与going
def p=new Person(fName:params.fName,age:params.age)
相同。无卡滞。这不是储蓄。我将更新我的代码。请添加您在问题中使用的grails版本以及收到的任何错误。这是我得到的
没有这样的属性:params for class:pro.PersonService
我在服务类中编写了此属性。您需要将参数从控制器传递到服务。例如controllermethod={myservice.saveService(params){//do here}}是的,谢谢。现在它开始工作了。我不知道该把谁的问题标记为已被接受。不过,我会将@grantmc标记为正确答案,因为他也帮助我提出了这些观点。谢谢你帮助我。
def ad = new Address(number:params.number , roadName:params.roadName , country: params.country)
if (ad.save(flush: true)) {        
    def p = new Person(fName:params.fName , age: params.age, address:ad)
       p.save()
} else {
    // display validation errors
}