【问题标题】:Grails one-to-many using two domains on a single form在一个表单上使用两个域的 Grails 一对多
【发布时间】:2015-12-03 12:45:16
【问题描述】:

我是 Grails 和 Groovy 的新手。我正在尝试从两个域类创建一个表单,但它没有更新两个域。

1) 我的域类是:a)

 class Alacat { String email String name Date startdate = new Date() Date   
 enddate = new Date() String starttime String endtime boolean roadclose

static  belongsTo  =  [user :  User]

String  toString()  { return  "User of $name  (id:  $id)" }
String  getDisplayString()  { return  name }

static constraints = {
    email  email:  true,  blank: false
    name blank:  false
    startdate blank:  false
    enddate  blank:  false
    starttime nullable:  true
    endtime   nullable:  true
    roadclose     blank:  false

    alertuser nullable:  false
 }

}

(b)

class User {
   String  loginId

   Set alerts=[]
   static  hasMany  =  [ alerts :  Alacat ]

   static constraints = {
    loginId  size:  3..20,  blank:  false
   }
}

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>

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

【问题讨论】:

    标签: grails


    【解决方案1】:

    params 地图可能看起来像这样:

    [
        loginId: 'something',
        alerts: [
            email: 'blah',
            name: 'blah blah',
            ...
        ]
    ]
    

    所以 User 对象是这样实例化的:

    def user = new User(loginId: 'something', alerts: alerts)
    

    User.alerts 是一个集合,而不是一个映射。此外,我相信您需要致电 instance.addTo*() 来添加到 hasMany 集合。试试这个:

    def user  =  new User(params) 
    
    user.addToAlerts new Alacat(params.alerts)
    ...
    

    而且创建一个用户参数会更干净

    <g:textField name="user.loginId" value="${user?.loginId}"/>
    

    然后这样做:

    def user = new User(params.user) 
    

    斯坦的回复:
    伊曼纽尔·罗莎, 非常感谢你的帮助。但是,我收到了这个新的错误消息“类 [class alerts.User] 的属性 [loginId] 不能为空”。这是我的控制器代码:
    类用户控制器 { 静态脚手架 = 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"
                   }   
        }  
    }    
    

    }

    【讨论】:

    • Emmanuel Rosa,非常感谢您的帮助。但是,我收到此错误消息“类 [class edu.psu.opp.alerts.User] 的属性 [loginId] 不能为空”。
    • 好的,请继续将更新后的代码添加到您的问题中。
    • Emmanuel Rosa,非常感谢您的帮助。但是,我收到此错误消息“类 [class edu.psu.opp.alerts.User] 的属性 [loginId] 不能为空”。这是我的控制器代码: 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 = "成功创建用户" } else { flash.message = "错误创建用户" } } }
    • 你的 loginId &lt;g:textField&gt; 是什么样的?
    • Emmanuel,我正在尝试在我的应用程序上运行测试单元,但出现以下错误。也许,我没有正确设置它。它在同一个域上。
    【解决方案2】:

    看起来像这样:

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

    此外,我更改了用户域约束,如下所示(即从 loginId 空白:false 到 loginId nullable:true),它在用户表的 login_Id 字段上写入 null。

    class User {
        String  loginId
    static constraints = {
        loginId  nullable:true
      }
    

    }

    非常感谢您的快速回复。

    【讨论】:

      【解决方案3】:

      loginId 字段为空,因为 UserController 信息应该是 new User(params.user) 而不是 new User(params)。我的意思是问题出在我的 UserController 上。

      非常感谢 Emmanuel 的帮助。我真的很感激。

      【讨论】:

      • 啊!我正要告诉你。太好了,我很高兴你能成功:)
      • 非常感谢!非常感谢您的帮助。
      猜你喜欢
      • 2013-05-03
      • 1970-01-01
      • 2015-12-28
      • 2013-10-24
      • 2014-07-13
      • 1970-01-01
      • 2014-06-04
      • 2012-02-08
      • 2015-01-28
      相关资源
      最近更新 更多