【问题标题】:Creating a view with Domain object fields使用域对象字段创建视图
【发布时间】:2014-03-25 15:27:29
【问题描述】:

我有以下域类。

Address

String number
String roadName
String country

Person

String fName
String age
Address address

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

我的 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 方法中? (有人可以给我看一个带有PersonAddress 文本字段的示例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" />

在这里,我只使用了域类中的几个对象来看看它是否有效。

我在两个域类中还有一个名为 createdDate 的参数。这也需要自动插入。

我的服务等级如下:

def saveService () {

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

1.) 我收到一个错误,它是 > No such property: params for class: pro.PersonService

2.) 我有 2 个具有相同名称的参数的域类。例如AnimalPerson 域类有一个名为firstName 的参数。根据您之前的解决方案,grail 将如何区分它属于哪个域类?

我使用的是 Grails 2.2.4

【问题讨论】:

标签: grails


【解决方案1】:

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

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

如果保存正确,则返回Address,结果为true,否则返回null(或false)。

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

因此,例如,要映射您的 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>

【讨论】:

  • 我还希望在视图中显示Address 字段。因此,用户可以在创建新的person 时创建新地址。那么我该怎么做呢?
  • 简单,只需为Address的每个属性添加g:textField标签即可。让我编辑我的答案以向您展示我的意思。
  • 已编辑。因为表单中这些字段的名称对应于 Address 和 Person 类中的属性名称,所以您可以使用数据绑定来创建每个对象。 def p = new Person(params)def p = new Person(fName: params.fName, age: params.age) 相同。
  • 没有仍然卡住。它没有得到储蓄。我会更新我的代码。
  • 请添加您在问题中使用的 grails 版本以及您收到的任何错误。
【解决方案2】:

你可以试试这个

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
}

【讨论】:

  • 这是我得到的No such property: params for class: pro.PersonService我已经在服务类中写了这个。
  • 您需要将参数从控制器传递给服务。例如 controllermethod = { myservice.saveService(params){ //在这里做} }
  • 好的,谢谢。现在它的工作。我不知道我应该将谁标记为已接受。但是,我会将@grantmc 标记为正确答案,因为他也帮助我了解了这些观点。谢谢你帮助我。
猜你喜欢
  • 1970-01-01
  • 2010-10-27
  • 2015-09-18
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多