Grail验证已保存到数据库的数据

时间:2016-12-07 09:14:23

标签: validation grails

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

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

2 个答案:

答案 0 :(得分:0)

验证已经存在的对象时会发生什么? 在检索之后和​​验证之前有没有办法使它看起来很脏?

答案 1 :(得分:0)

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

无论如何,我编辑的原因并不高于捕获多层表单的更复杂的东西。 所以你有step 1 sent paramscontroller,然后passed those params到新的gsp或甚至是iteration的{​​{1}} { {1}}到表单中的另一个belongs。 通常你会得到:

totally different object

将表单提交给控制器

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

//这是在src / main / groovy

Class MyDomainController {

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

这又在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

我已经更新了答案,因为我建议将对象封装在bean中,而没有任何有关如何进行此类操作的详细信息。我希望以上是清楚的。这一切都在飞行中,但如果经过测试,希望它的工作原理如上所述。

在下次更新后添加解释form2示例。最后验证你调用的两个套件

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

因为您将它绑定到另一个验证类,所以该类的规则现在可以作为验证过程的一部分应用。

旧答案

很简单地说它是在db上为什么你想要验证一个经过验证的输入。无论如何,在Grails 2 if (bean.validate() && bean.form2.validate()) { //all good } validation bean src/groovy/package@Validateable

Grails 3:src/main/groovy/package implements 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()