Grails:save不起作用

Grails:save不起作用,grails,save,Grails,Save,我已经在grails中创建了一个新域,并且从一个我试图保存的控制器中创建了一个新域,但是没有在数据库中保存任何内容。。代码如下 控制器 领域 我正试图通过这个url保存 那么我做错了什么。。。请记住堆栈跟踪中没有错误,我将首先将其包装在一个集成测试中,如下所示: import groovy.util.GroovyTestCase import org.junit.Test public class RegisterControllerTests extends GroovyTestCase

我已经在grails中创建了一个新域,并且从一个我试图保存的控制器中创建了一个新域,但是没有在数据库中保存任何内容。。代码如下

控制器

领域

我正试图通过这个url保存


那么我做错了什么。。。请记住堆栈跟踪中没有错误,我将首先将其包装在一个集成测试中,如下所示:

import groovy.util.GroovyTestCase
import org.junit.Test

public class RegisterControllerTests extends GroovyTestCase {

    @Test
    void saveAction() {
        def controller = new RegisterController() //or whatever the controller name is
        controller.params.name = "SomethingUnique"
        controller.params.email = "example@example.com"
        controller.params.password = "password"
        controller.params.signedIn = "false"

        controller.register()

        def registered = Registered.findByName("SomethingUnique")
        assert "example@example.com" == registered.email
        assert "password" == registered.password
        assert false == registered.signedIn
    }
}
然后,我将从使控制器操作尽可能简单开始:

def register={
    String name = params.name
    String email = params.email
    String pass = params.password
    boolean signedIn = params.signedIn
    def rUser = new Registered()
    rUser.name = name
    rUser.email = email
    rUser.password = pass
    rUser.signedIn = signedIn

    rUser.save(flush:true, failOnError:true)  //I would remove the failOnError after you identify the issue.
}

这样,您可以快速重复测试并找出问题所在。将
failOnError:true
添加到save调用将导致在异常未通过验证时引发异常。如果这个简单的示例有效,请重新开始寻找更优雅的解决方案,以确定问题所在。

在保存调用后执行“println rUser.errors”时会得到什么?在这种情况下为什么会出现FailOneError?你真的推荐错误500页是因为用户输入了无效的密码或遗漏了他们的电子邮件吗?我会添加failOnError以试图识别问题。在发现问题后,我不会把它放在那里(可能应该指定它)。我在Config.groovy中设置了
failOnError=true
,但在我的代码中,我总是在保存之前调用
validate()
。这样我只会得到意外保存失败的stacktrace。脱离主题,但您也可以通过删除所有分配和使用
def rUser=new Registered(params)
,进一步简化此过程,它将为您匹配属性名称并删除许多不必要的行,请参阅@Steve Yes,这将有效,而询问者之前就是这么做的。我只建议将其分解以使其工作,然后重构为更优雅的解决方案,如传递参数。
import groovy.util.GroovyTestCase
import org.junit.Test

public class RegisterControllerTests extends GroovyTestCase {

    @Test
    void saveAction() {
        def controller = new RegisterController() //or whatever the controller name is
        controller.params.name = "SomethingUnique"
        controller.params.email = "example@example.com"
        controller.params.password = "password"
        controller.params.signedIn = "false"

        controller.register()

        def registered = Registered.findByName("SomethingUnique")
        assert "example@example.com" == registered.email
        assert "password" == registered.password
        assert false == registered.signedIn
    }
}
def register={
    String name = params.name
    String email = params.email
    String pass = params.password
    boolean signedIn = params.signedIn
    def rUser = new Registered()
    rUser.name = name
    rUser.email = email
    rUser.password = pass
    rUser.signedIn = signedIn

    rUser.save(flush:true, failOnError:true)  //I would remove the failOnError after you identify the issue.
}