0

这个例子是关于从客户那里收到一个请求,卖家可以选择向客户提供报价。

请求存储在名为“Request”的类中,而报价存储在“Offer”类中。

流程是:

  1. 卖家从请求列表中获取请求并被重定向到 Request.show-form。

  2. 在这里,他可以通过链接选择使用此请求中的数据创建报价。

  3. 现在,卖家被重定向到 Offer.Create-form,其中填充了来自请求的数据。

  4. 卖家现在可以添加和/或更改数据以及确认或取消此报价。

而已。

我的想法是,请求控制器在收到操作后,将获取请求的 ID,然后调用服务 Offer_service,该服务又使用 ID 读取请求,然后创建一个新的 Offer 对象。服务继续用来自请求对象的数据填充这个对象,然后调用报价控制器打开创建表单,让卖方完成报价。

我想知道我是否走在正确的道路上,或者我是否错过了什么?

当然,这对你来说很简单,有经验的人,但对我来说……我是新人,有时感觉就像在深水中一样。我会很感激每一种可以引导我前进的建议、技巧等。

修正.. 你看,我们希望保持请求和报价彼此独立,如果卖家想要更改请求中的某些值,他将只更改报价。请求中的值应保持不变. 此外,报价的 id 应该存储在请求中,以便您可以根据需要直接从请求表单跳转到报价。反之亦然,请求的 id 应存储在要约中,以便可以返回请求。但是只有在保存(确认)报价时才应设置这些链接(id:s)。在将请求数据存储在报价中之前,还可能对请求数据进行更多处理。也可以在没有请求的情况下构建报价,然后没有与请求的连接。这就是为什么我认为服务应该很好地保持请求和提供彼此独立。

4

1 回答 1

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/main/groovy/package/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 域类绑定,它将失效并超出执行范围有一个返回的块告诉它一切都很好并且在那个块内处理

最重要的是,一旦绑定发生,即没有问题,您可以神奇地自动自动访问 actionOffer gsp 中 bean 中的所有请求元素

将上述内容与您所写的内容进行比较时,您明白我所说的复杂化是什么意思吗?

更新了控制器以显示如何将 bean 传递回视图。在 acionOffer myView gsp 中,如果您现在引用${instance.userRequestBean.something}this 将映射并从请求中返回某物对象。(无需建立任何东西)一旦你有 id

因此,在阅读了您的评论之后,您需要的是另一个请求的 bean,当请求对象保存在 bean 中时,如下所示,您已经拥有了 bean。无论如何假设你

在 src/main/groovy/package/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
   }

}

查看更新后的代码,我添加了一个新的 formatBean 函数,它在主类中调用,然后绑定一个新的 userRequestBean,它现在包含您的实际 userRequest 域类的所有元素 - 您现在可以作为 userRequestBean 访问新表单上的那些元素。

我仍然认为您不需要所有这些复杂性。

你说用户然后想要更新请求,所以你最初得到 ${instance.userRequest} 整个对象你只需使用现有值重复表单,保存后你必须再次捕获它们以便重新应用现有值将原始对象保存到这些参数的代码,

无论如何,我已经向您展示了一种更复杂的方法,当您满意时,可以将真实域类绑定到瞬态对象(非数据库)

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()

于 2017-02-25T11:14:31.323 回答