2011-05-17 63 views
2

HI。我有这个类:Grails数据绑定多个域类

class Carro { 

    String name 
    String marca 
    String matricula 

    static constraints = { 
     name(nullable:false, blank:false) 
    } 

    static mapping = { 
     version false 
    } 
} 

class CarroMovel { 
    String move 
    String rodas 
    String espelhos 
    Carro carro 

    static hasMany = [carros: Carro] 

    static constraints = { 
     move(nullable:false, blank:false) 
    } 

    static mapping = { 
     version false 
    } 
} 

和控制器:

class CarroController{ 
def save2 = { 

     def carroInstance = new Carro() 
     carroInstance.name = params.name 
     carroInstance.marca = params.marca 
     carroInstance.matricula = params.matricula 

     if (carroInstance.save(flush: true)) { 
      redirect(uri:"/home.gsp") 
     } 
     else { 
      render(view: "/testeAdd", model: [carroInstance: carroInstance]) 
     } 

    } 

和视图testeAdd.gsp

<g:form controller="carro" action="save2"> 
<h1>Add New Carro Record</h1> 
<p>Basic Information</p> 

<label>Name 
<span class="small">as</span> 
</label> 
<input type="text" name="name" value="${carroInstance?.name}" /><br> 

<label>Marca 
<span class="small">as</span> 
</label> 
<input type="text" name="marca" value="${carroInstance?.marca}" /><br 

    <label>Matricula 
<span class="small">as</span> 
</label> 
<input type="text" name="matricula" value="${carroInstance?.matricula}" /><br> 


<g:submitButton name="save" value="Save" id="oneone"/> 


<div class="spacer"></div> 
    </g:form> 

       <g:hasErrors bean="${carroInstance}"> 
      <div class="errors"> 
       <g:renderErrors bean="${carroInstance}" as="list" /> 
      </div> 
      </g:hasErrors> 

这是工作好。现在我想能够绑定多个域类的数据。因此,与我的gsp文件中的当前代码一起,我还想在同一个save2中添加carroMovel事件。我不知道如何做到这一点,特别是导致Carro需要carroMovel类的ID。请帮忙吗?谢谢。

我folowed一些建议,现在的结果如下(我不是担心错误的验证还):

def save3 = { 

     def carroInstance = new Carro() 
     def carroMovelInstance = new CarroMovel() 

     carroInstance.name = params.carro.name 
     carroInstance.marca = params.carro.marca 
     carroInstance.matricula = params.carro.matricula 

     carroMovelInstance.move = params.carroMovel.move 
     carroMovelInstance.rodas = params.carroMovel.rodas 
     carroMovelInstance.espelhos = params.carroMovel.espelhos 

     carroInstance.save() 
     carroMovelInstance.carro = carroInstance 
     carroMovelInstance.save() 

    } 

<g:form controller="carro" action="save3"> 
<h1>Add New Conference Record</h1> 
<p>Basic Information</p> 

<label>Name 
<span class="small">Add your name</span> 
</label> 
<input type="text" name="carro.name" value="${carroInstance?.name}" /><br> 

<label>Marca 
<span class="small">Add your name</span> 
</label> 
<input type="text" name="carro.marca" value="${carroInstance?.marca}" /><br 

    <label>Matricula 
<span class="small">Add your name</span> 
</label> 
<input type="text" name="carro.matricula" value="${carroInstance?.matricula}" /><br> 

<label>Move 
<span class="small">Add your name</span> 
</label> 
<input type="text" name="carroMovel.move" value="${carroMovelInstance?.move}" /><br> 

<label>Rodas 
<span class="small">Add your name</span> 
</label> 
<input type="text" name="carroMovel.rodas" value="${carroMovelInstance?.rodas}" /><br> 

<label>Espelho 
<span class="small">Add your name</span> 
</label> 
<input type="text" name="carroMovel.espelho" value="${carroMovelInstance?.espelho}" /><br> 

<g:submitButton name="save" value="Save" id="addConference"/> 

的卡罗对象保存在数据库中,altought,没什么与CarroMovel发生,它不会被保存,我无法弄清楚。

+0

[Grails multiple databinding domain classes]的可能重复(http://stackoverflow.com/questions/6048654/grails-multiple-databinding-domain-class) – ataylor 2011-05-18 20:08:02

回答

0

如果我正确理解你的问题,你可以试试这个。 首先,编辑表单,以包括CarroMovel类必要的字段, 如

<label>Move 
<span class="small">as</span> 
</label> 
<input type="text" name="move" value="${carroMovelInstance?.move}" /> 

然后

在SAVE2行动

def carroInstance = new Carro() 
carroInstance.name = params.name 
carroInstance.marca = params.marca 
carroInstance.matricula = params.matricula 

def carroMovelInstance = new CarroMovel() 
carroMovelInstance.name = params.move 
carroMovelInstance.marca = params.rodasa 
carroMovelInstance.matricula = params.espelhos 
carroMovelInstance.carro = carroInstance 

因为卡罗不属于CarroMovel节约carroMovelInstance不会级联到carroInstance,因此在保存其拥有的实例之前,需要单独保存每个实例。

carroMovelInstance.carro.save() 
if (carroMovelInstance.save(flush: true)) { 
     redirect(uri:"/home.gsp") 
    } 
    else { 
     render(view: "/testeAdd", model: [carroInstance: carroInstance, carroMovelInstance:carroMovelInstance]) 
    } 

让我知道这是否适合你。

+0

没有工作。 Carro被保存,但carroMovel没有。我不知道为什么?!? – robert 2011-05-18 12:54:59

0

我通常使用这种类型的东西的命令对象。

在你的控制器做这样的事情:

class CarroController { 

    def show = { 
    [cmd: new MyCommand()] 
    } 

    def save2 = { MyCommand cmd -> 
    def carro = cmd.carro 

    if (carro.save()) { 
     cmd.movel.carro = carro 
     if (cmd.movel.save()) { 
     redirect uri: 'home.gsp' 
     } else { 
     // show form again 
     render view: 'show', model:[cmd:cmd] 
     } 
    } else { 
     // show form again 
     render view: 'show', model:[cmd:cmd] 
    } 
    } 

    // same file or some other class file 
    class MyCommand { 
     Carro carro 
     CarroMovel movel 
    } 
} 

您需要调整您的形式一点,以及...

如果你有“卡罗”字段中引用它们是这样的:

<input type="text" name="carro.matricula" value="${cmd.carro?.matricula}" /> 

如果你有 “CarroMovel” 领域,像这样:

<input type="text" name="movel.rodas" value="${cmd.movel?.rodas}" /> 

此代码可能不完全正确(我没有测试它),但应该让您了解正确的路径。此外,也可以不使用命令对象中的对象,而只需要绑定字段,然后通过辅助方法(def buildCarro(){...})或手动控制器方法从中构建实际的域对象。

+0

您也可以在此实例中调整您的模型以添加漫威对carro对象。 – 2011-05-18 06:03:54

2

首先,我会将输入名称更改为carro.name,carro.marca,carroMovel.move,...,以便通过名称区分它们。

<input type="text" name="carro.name"/><br> 
<input type="text" name="carro.marca"/><br> 
<input type="text" name="carroMovel.move"/><br> 

这具有的优点是,在所述控制器的结合可以做标准的Grails方式,并且正确的值在表格中输入而不设置的值属性。

carro.properties = params.carro 
carroMovel.properties = params.carroMovel 

在控制器操作中,您还可以保存并链接Carro和CarroMovel实例。

carro.save() 
carroMovel.carro = carro 
carroMovel.save() 
if(carroMovel.hasErrors(){ 
    render(view: 'save3', model: [carro: carro, carroMovel.carroMovel]) 
} 
+0

你好。感谢你的回答。我更新了我的进度,但carroMovel不拯救我不知道为什么。请看看 – robert 2011-05-18 12:54:16

+0

请确保carroMovel保存没有错误。我编辑了我的帖子。 – Ruben 2011-05-18 18:34:23