Grails在一个表单上使用两个域实现一对多

Grails在一个表单上使用两个域实现一对多,grails,Grails,我是Grails&Groovy的新手。我试图从两个域类创建一个表单,但它并没有更新两个域 1) 我的域类是:a) (b) 2) 我的控制器(UserController)逻辑是: def createalert() { if (request.method == "POST") { def user = new User(params) if (user.validate()) { user.save() flash.message = "Su

我是Grails&Groovy的新手。我试图从两个域类创建一个表单,但它并没有更新两个域

1) 我的域类是:a)

(b)

2) 我的控制器(UserController)逻辑是:

def createalert()  {
   if (request.method == "POST")  {

  def user  =  new User(params) 

  if  (user.validate()) {
     user.save()
     flash.message  = "Successfully Created User"
     redirect(uri : '/User/createalert')

  } else {
     flash.message  =  "Error Creating User"

     return [ user : user]   
      }   
   }    
}    
3) createalert.gsp视图类:

<g:form  action="createalert">
  <fieldset class="form">
    <div class="fieldcontain required">
        <label for="loginId">Login ID</label>
        <g:textField name="loginId" value="${user?.loginId}"/>
    </div>

    <div class="fieldcontain required">
        <label for="alerts.email"> Email address:</label>
         <g:textField name="alerts.email"
            value="${user?.alerts?.email}"/>
    </div>
    <div class="fieldcontain required">
        <label for="alerts.name">Name & Title:</label>
        <g:textField name="alerts.name"
            value="${user?.alerts?.name}"/>
    </div>
    <div class="fieldcontain required">
        <label for="alerts.startdate">Start Date Notice:</label>
          <g:datePicker  name="alerts.startdate" value="${new Date()  
         }"                            precision="day" />
    </div>
    <div class="fieldcontain required">
        <label for="alerts.enddate">End Date Notice:</label>
        <g:datePicker  name="alerts.enddate" value="${new Date() }" 
              precision="day" />
    </div>
    <div class="fieldcontain required">
        <label for="alerts.starttime">(optional) St Time:</label>
        <g:textField name="alerts.starttime"
            value="${user?.alerts?.starttime}"/>
    </div>
    <div class="fieldcontain required">
        <label for="alerts.endtime">(optional) E-Time:</label>
        <g:textField name="alerts.endtime"
            value="${user?.alerts?.endtime}"/>
    </div>
    <div class="fieldcontain required">
        <label for="roadclose">closed 24-hours?</label>
        <g:radioGroup name="roadclose"
          labels = "[ 'Yes', 'No']"
          values="[ 'Y', 'N' ]"
          value = "Y">
          ${it.label} ${it.radio}
        </g:radioGroup>
    </div>

</fieldset>
<fieldset class="buttons">
    <g:submitButton name="createalert" value="Create Alert"/>
    <g:link action="createalert">Back to Create  Information </g:link>
</fieldset>

登录标识
电邮地址:
姓名和职务:
开始日期通知:
截止日期通知:
(可选)St时间:
(可选)电子时间:
24小时不营业?
${it.label}${it.radio}
返回以创建信息


注意:我的问题是只创建用户域(User-loginId)信息,而Alacat没有任何信息。我希望使用createalert表单创建两个域(User和Alacat)的属性。运行时没有出现任何错误。

参数映射可能如下所示:

[
    loginId: 'something',
    alerts: [
        email: 'blah',
        name: 'blah blah',
        ...
    ]
]
def user = new User(loginId: 'something', alerts: alerts)
 <div class="fieldcontain required">
           <label for="loginId">Login ID</label>
           <g:textField name="user.loginId" value="${user?.loginId}"/>
 </div>
因此,用户对象被实例化如下:

[
    loginId: 'something',
    alerts: [
        email: 'blah',
        name: 'blah blah',
        ...
    ]
]
def user = new User(loginId: 'something', alerts: alerts)
 <div class="fieldcontain required">
           <label for="loginId">Login ID</label>
           <g:textField name="user.loginId" value="${user?.loginId}"/>
 </div>
User.alerts
是一个集合,而不是地图。此外,我相信您需要调用
instance.addTo*()
来添加到hasMany集合中。请尝试以下方法:

def user  =  new User(params) 

user.addToAlerts new Alacat(params.alerts)
...
创建一个用户参数会更简洁

斯坦的回答:
伊曼纽尔·罗莎, 非常感谢你的帮助。但是,我收到了新的错误消息“类[class alerts.User]的属性[loginId]不能为null”。这是我的控制器代码:
类用户控制器{ 静态脚手架=真

def createalert()  {
    if (request.method == "POST")  {
       def User user  =  new User(params)
       if  (user.validate()) {
           user.addToAlerts  new Alacat(params.alerts)
           user.save()
           flash.message  = "Successfully Created User"
       } else {
           flash.message  =  "Error Creating User"
               }   
    }  
}    

}参数映射可能看起来像这样:

[
    loginId: 'something',
    alerts: [
        email: 'blah',
        name: 'blah blah',
        ...
    ]
]
def user = new User(loginId: 'something', alerts: alerts)
 <div class="fieldcontain required">
           <label for="loginId">Login ID</label>
           <g:textField name="user.loginId" value="${user?.loginId}"/>
 </div>
因此,用户对象被实例化如下:

[
    loginId: 'something',
    alerts: [
        email: 'blah',
        name: 'blah blah',
        ...
    ]
]
def user = new User(loginId: 'something', alerts: alerts)
 <div class="fieldcontain required">
           <label for="loginId">Login ID</label>
           <g:textField name="user.loginId" value="${user?.loginId}"/>
 </div>
User.alerts
是一个集合,而不是地图。此外,我相信您需要调用
instance.addTo*()
来添加到hasMany集合中。请尝试以下方法:

def user  =  new User(params) 

user.addToAlerts new Alacat(params.alerts)
...
创建一个用户参数会更简洁

斯坦的回答:
伊曼纽尔·罗莎, 非常感谢你的帮助。但是,我收到了新的错误消息“类[class alerts.User]的属性[loginId]不能为null”。这是我的控制器代码:
类用户控制器{ 静态脚手架=真

def createalert()  {
    if (request.method == "POST")  {
       def User user  =  new User(params)
       if  (user.validate()) {
           user.addToAlerts  new Alacat(params.alerts)
           user.save()
           flash.message  = "Successfully Created User"
       } else {
           flash.message  =  "Error Creating User"
               }   
    }  
}    
}

它看起来像这样:

[
    loginId: 'something',
    alerts: [
        email: 'blah',
        name: 'blah blah',
        ...
    ]
]
def user = new User(loginId: 'something', alerts: alerts)
 <div class="fieldcontain required">
           <label for="loginId">Login ID</label>
           <g:textField name="user.loginId" value="${user?.loginId}"/>
 </div>
}

非常感谢您的快速回复。

看起来是这样的:

[
    loginId: 'something',
    alerts: [
        email: 'blah',
        name: 'blah blah',
        ...
    ]
]
def user = new User(loginId: 'something', alerts: alerts)
 <div class="fieldcontain required">
           <label for="loginId">Login ID</label>
           <g:textField name="user.loginId" value="${user?.loginId}"/>
 </div>
}


非常感谢您的快速响应。

loginId字段为空,因为UserController信息应该是新用户(params.User),而不是新用户(params)。我是说问题出在我的用户控制器上


非常感谢艾曼纽的帮助。非常感谢。

loginId字段为空,因为UserController信息应该是新用户(params.User),而不是新用户(params)。我是说问题出在我的用户控制器上


非常感谢艾曼纽的帮助。非常感谢。

艾曼纽·罗莎,非常感谢你的帮助。但是,我收到错误消息“类[class edu.psu.opp.alerts.User]的属性[loginId]不能为空”。好的,请继续,将更新的代码添加到您的问题中。Emmanuel Rosa,非常感谢您的帮助。但是,我收到了错误消息“类[class edu.psu.opp.alerts.User]的属性[loginId]不能为null”。这是我的控制器代码:class UserController{static scaffold=true def createalert(){if(request.method==“POST”){def User User=new User(params)if(User.validate()){User.addToAlerts new Alacat(params.alerts)User.save()flash.message=“Successfully Created User”}else{flash.message=“Error Creating User”}}}}您的loginId
是什么样子的?Emmanuel,我正在尝试在我的应用程序上运行一个测试单元,出现以下错误。可能是我没有正确设置它。它位于相同的域上。Emmanuel Rosa,非常感谢您的帮助。但是,我收到了此错误消息“类[class edu.psu.opp.alerts.User]的属性[loginId]不能为null”。好的,请继续向您的问题添加更新的代码。Emmanuel Rosa,非常感谢您的帮助。但是,我收到了错误消息“类[class edu.psu.opp.alerts.User]的属性[loginId]不能为null”。这是我的控制器代码:class UserController{static scaffold=true def createalert(){if(request.method==“POST”){def User User User=new User(params)if(User.validate()){User.addToAlerts new Alacat(params.alerts)User.save()flash.message=“成功创建用户”}else{flash.message=“错误创建用户”} } } }你的loginId
是什么样子的?Emmanuel,我正试图在我的应用程序上运行一个测试单元,我得到了下面的错误。也许,我没有正确设置它。它在相同的域上。啊!我正要告诉你。太好了,我很高兴你让它工作:)非常感谢!我真的很感谢你的帮助。啊!我正要告诉你帽子。太好了,我很高兴你把它修好了:)非常感谢!我真的很感谢你的帮助。