gpt4 book ai didi

grails - 在 GRAILS 中创建与其他类型对象不同类型的对象时需要建议如何使用服务

转载 作者:行者123 更新时间:2023-12-02 15:49:11 25 4
gpt4 key购买 nike

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

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

流程是:

  • 卖家从请求列表中获取请求并被重定向到 Request.show-form。
  • 在这里,他可以通过链接选择使用此请求中的数据创建报价。
  • 现在,卖家被重定向到 Offer.Create-form,其中填充了来自请求的数据。
  • 卖家现在可以添加和/或更改数据以及确认或取消此报价。

  • 就是这样。

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

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

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

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

    最佳答案

    认为你把事情复杂化了。简而言之,当您拥有请求的 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}"/>

    在那个 Controller 中
    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 域类绑定(bind),它将失效并超出执行范围有一个返回的 block 告诉它一切都很好并且在那个 block 内处理

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

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

    更新了 Controller 以显示如何将 bean 传递回 View 。如果您现在引用 ${instance.userRequestBean.something},请在 acionOffer myView gsp 中这将映射并从请求中返回某物对象。 (无需建立任何东西)一旦你有 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 函数,它在主类中调用,然后绑定(bind)一个新的 userRequestBean,它现在包含您的实际 userRequest 域类的所有元素 - 您现在可以作为 userRequestBean 访问新表单上的那些元素。

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

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

    无论如何,我已经向您展示了一种更复杂的方法,当您满意时,可以将真实域类绑定(bind)到 transient 对象(非数据库)
    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()

    关于grails - 在 GRAILS 中创建与其他类型对象不同类型的对象时需要建议如何使用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42453908/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com