2011-05-17 60 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