2016-12-07 101 views
0

我有这个非常复杂的形式。所有的领域都必须填补,但填补的过程可以得到保存,继续进行。所以我需要的是,当最终确认按下时,所有的数据都得到验证。但因为它已经保存到数据库调用validate()不会工作。我用save(validate:false)保存数据,因为当工作仍在progremm中时我不需要验证。圣杯确认已经保存到数据库的数据

如何验证已保存到数据库的数据?我必须手动执行吗?

+1

也许你需要另一个表来存储临时数据,临时数据是未验证的数据('确认'未按下) – Nico

回答

0

当您验证一个已经存在的对象时会发生什么? 有没有办法让它在检索之后和​​验证之前显得很脏?

0

我已经编辑了更详细的解释表单封装的答案,通常可能来自表单输入的层级步骤过程或更复杂的迭代对象,需要在别处。首先,如果您只需要一个步骤即可捕获各种信息,然后您很乐意手动处理所有这些信息,并将其存储在不同类别的大量参数转储中,然后查看jquery-ui tabs。如果您选择使用制表符的动态功能,即<li><a href="someurl">click</li>然后将内容动态加载到给定的选项卡,那么这也会覆盖单个表单,或者如果您希望在DOM内更复杂。

无论如何,我编辑的原因并不在它之上,是因为捕捉多层表单更复杂一些。 所以你不得不step 1sent params通过一个controller这则passed those params到一个新的gsp或甚至的东西,belongs另一个totally different object内形式的iteration。 通常,您将结束:

<g:form action=myDomain" action="doThis"> 

<!-- this is some iteration that belongs to some other class outside of what i am actually trying to do: --> 
<g:each in="someObject" var="p"> 
<g:hiddenField name="form1.firstName" value="${p.firstName}"/> 
<!-- in this case hidden --> 
<g:hiddenField name="form1.surName" value="${p.surName}"/> 
</g:each> 

<!-- this is my actual form --> 
<g:textField name="username" /> 

</g:form> 

当表单被提交到控制器

Class MyDomainController { 

    def doThis(MyBean bean) { 
     save(bean) 
    } 
} 

//这是的src/main /常规

import grails.validation.Validateable 
//important for some reason it needs entire collections 
// have had issues initialising it without .* 
import org.apache.commons.collections.* 
Class MyBean implements Validateable { 
    //this is capturing the current form fields 
    String username 

    //This is now collecting our form1 fields 
    List<MyDetailsBean> form1 = ListUtils.lazyList([], { new MyDetailsBean() } as Factory) 

    //if that had been 1 instance of it or like as mentioned passed from pervious form and called form2 
    MyDetailsBean form2 

    static constraints={ 
    username(nullable:false) //, validator: checkSomething) 
    } 
} 

这又是在src/main/groovy并用于最初收集对象的每次迭代:

import grails.validation.Validateable 
Class MyDetailsBean implements Validateable { 
    String firstName 
    String surName 
} 

我已经更新了答案,因为我建议将对象封装在一个bean中,而没有任何关于如何去做这样的事情的细节。我希望以上清楚。这一切都在飞行中,但如果经过测试,希望一切都如上所述。

在下次更新后添加说明form2的例子。终于验证你打电话

if (bean.validate() && bean.form2.validate()) { 
//all good 
} 

因为你是它绑定到类的规则,现在可以作为验证过程的一部分被应用的另一个验证类两套。


老答案

很简单地把它的分贝为什么地球上,你会想验证一个验证的输入。不管怎样的解决办法是在Grails的2 src/groovy/package这是@Validateable

Grails的3 validation beansrc/main/groovy/packageimplements Validateable

class MyDmainBean { 
    // must declare id 
    def id 
    // Then each object in your real domain class 

    static constraints = { 
     id (nullable:true,bindable:true) 
     importFrom MyDomainClass//, exclude: ['field1'] 
      //field 1 is not included but if field 1 was integer 
      // in actual domain class and BigDecimal in bean 
      //then exlude it since it won't bind 

    } 

    def formatObject(MyDomainClass domain) {  
     id=domain.id 
     .. 
    } 
} 

现在,您可以拨打

MyDomain record = MyDomain.get(0L) 
MyDmainBean bean = new MyDmainBean().formatObject(record) 
bean.validate() 
+0

数据库中的数据未经验证。首次验证发生在按下确认时。 –

+0

理论上你的设计结构很糟糕,只有经过验证的数据应该传递给db--确保数据的完整性已通过测试以确保能够存储。验证的关键就是这一点。即5的maxLength没有给出abcdefgh,它超出并抛出db异常。我建议你坚持使用验证bean捕获输入,这意味着各种形式处理它捕获和封装表单,如果你喜欢在不同的验证bean中。最后,当你为每个表每个bean输入所有必需的输入时存储它,或者这个东西可以工作 – Vahid

+0

或者引用jquery选项卡,并提供各种选项卡表单来决定你想要做什么以及它应该如何工作 – Vahid