2017-02-25 27 views
0

此示例是關於從賣方可以選擇向客戶提供報價的客戶的請求。需要建議如何在GRAILS中創建與另一種類型的對象不同類型的對象時使用服務

該請求存儲在一個名爲'Request'的類中,並且該報價存儲在'Offer'類中。

的流程爲:

  1. 賣方拾取從請求列表的請求,並且被重定向到Request.show形式。

  2. 在這裏,他可以選擇,通過一個鏈接,創建使用該請求的數據的要約。

  3. 現在賣方被重定向到填充有從請求數據中的Offer.Create形式。

  4. 賣家現在可以添加或更改數據,並確認或取消此優惠。

就是這樣。

我的想法是,請求控制器在接收到動作後,將獲取請求的ID,然後調用服務Offer_service,然後使用該ID讀取請求,然後創建一個新的Offer對象。該服務繼續用請求對象中的數據填充此對象,然後調用Offer-Controller打開創建表單以讓賣方完成報價。

我想知道我是否正確或如果我錯過了什麼?

當然,這對你來說很簡單,有經驗的人,但對我來說......我是新來的,有時候喜歡在深水中嬉戲。 我會感激每一種建議,提示等,可以帶領我前進。

修訂.. 你看,我們希望保持請求,如果賣方想一些值 從他會做只報價請求更改提供相互獨立和的。請求中的值應該保持不變。此外, 報價的ID應存儲在請求中,以便您可以直接從請求表單跳轉到報價。反之亦然 一個ID請求應該存儲在報價中,以便有可能返回請求。但是,如果報價已保存(確認),則只應將這些鏈接(id:s)設置爲 。 在將請求數據存儲在要約中之前,還可能需要對請求數據執行更多處理。 報價也可以在沒有請求的情況下構建,然後與請求無關。 這就是爲什麼我認爲服務應該很好地保持請求和提供獨立於彼此。

回答

0

認爲你已經過了複雜的事情。總之,當你有請求的ID。對於它所需要的報價對象。

所以這裏有雲:

<!-- this is in your gsp form that will be sending to request controller -maybe possibly it shold OfferController --> 
<g:hiddenField name="userRequest.id" value="${instance.id}"/> 

在該控制器

def MyController { 

    def actionOffer(OfferBean bean) { 
     bean.formatBean() 
     if (!bean.hasErrors()) { 
      //do SOmething 
      render view:'myView', model:[instance:bean] 
      return 
     } 

     render view:'failedView', model:[instance:bean] 
    } 
} 
在SRC

/主/常規/包/ OfferBean.groovy

class OfferBean implements Validateable { 
    // this is your actual request class 
    UserRequestBean userRequestBean 
    UserRequest userRequest 

    static constraints = { 
    request(nullable:false) //, validator:checkRequest) 
    } 

    def formatBean() { 
    UserRequestBean userRequestBean = new UserRequestBean() 
    userRequestBean.formatBean(request) 
    } 

    //You actually do not need this at all. 

    static def checkRequest = { val, obj, errors -> 
     if (!Request.get(obj.request.id)) { 
      errors.rejectValue('message','invalid.requestId',[val] as Object[],'') 
     } 
    } 
} 

基本上所有你需要的是userRequest.id作爲傳遞給OfferBean的驗證類的隱藏參數,約束設置爲false,這意味着我如果userRequest.id沒有神奇地與UserRequest域類綁定,它將會失效並且落在做的某個塊之外,該塊有一個返回,告訴它一切正常並在該塊內處理。

最重要的是一旦綁定發生了沒有任何問題,你自動神奇然後可以訪問所有的請求內的bean內的actionOffer gsp

你是否明白我的意思是在比較上面的內容和你寫的內容時的複雜性?

更新了控制器以顯示如何將bean傳回以查看。在acionOffer myView gsp中,如果您現在參考​​,它將映射並返回請求內的某個對象。 (不需要編譯任何東西)一旦你有編號

所以在閱讀你的評論之後,你需要的是另一個bean的請求,當一個請求對象保存在bean中,就像下面的bean一樣,你已經有了bean。總之假設你

中的src/main /常規/包/ UserRequestBean.groovy

class UserRequestBean implements Validateable { 
    def id 
    String name 
    //mapped like your UserRequestBean domain class 
    //meaning it contains all elements 

    //Now a function to map in actual user request 
    //into this bean 
    protected def formatBean(UserRequest ur) { 
    this.id=ur.id 
    this.name=ur.name 
    //and so on 

    return this 
    } 

} 

reveiew更新的代碼,我已經添加了所謂的主類的新formatBean函數,然後綁定一個新userRequestBean那現在包含實際的userRequest域類的所有元素 - 現在可以以userRequestBean的形式訪問新窗體上的那些元素。

我仍然不認爲你需要所有這些複雜性。

你說用戶然後想要更新請求,所以原來你得到$ {instance.userRequest}整個對象,你只需用現有的值重複表單,一旦保存你就必須再次捕獲它們,所以你重新應用現有的救原始對象對這些參數Code,

無論如何我要表現出你的真實域類綁定到一個瞬時對象(非數據庫)一個更爲複雜的方式,當你快樂時,你可以

then save those values back over the main class you could introduce 


def loadValues() { 
    Map values=[:] 
    //mapping all domain class objects back form bean 
    //required ones 
    values.with { 
    id=this.id 
    name=this.name 
    } 
    return values 
} 

然後你的object.properties=bean.loadValues()

+0

嗯..我不太確定,如果我理解你100%。 據我所知,我只應該在商品對象中存儲對請求對象的引用,即字段請求,然後直接在商品創建視圖中顯示來自請求的列。查看我上面的修改。 – larand

+0

我擴大了答案,它取決於你的頭腦,並採取你想要的 – Vahid

+0

所以簡而言之,在主頁面收集請求的參數將是'$ {instance.whatever}在第二個offerRequest gsp頁面請求對象已經映射到域類。如果你需要編輯它們,OfferBean的參數是'與每個對象,你需要小心真正的對象可以保存沒有保存。第二頁,你有第一你的ID發送 – Vahid

相關問題