Grails 3.3.4简单的Ajax调用

时间:2018-08-02 04:00:46

标签: ajax grails

我正在尝试在Grails 3.3.4中使用Ajax调用来保存记录。我查看了其他帖子,但似乎没有一个解决方案对我有所帮助。

在Grails 3中不推荐使用远程标签,因此不会有任何选择。我还需要获取所有表单字段,而不是单个文本框。但是似乎我的表单数据没有传递出去。有什么想法吗?

提交表单时,出现以下错误:

  

错误500:内部服务器错误

     

URI / user / saveAjax

     

groovy.lang.MissingMethodException类

     

消息为空

     

由无签名引起   方法:   com.vogella.grails.guestbook。$ UserServiceImplementation.save()是   适用于参数类型:   (grails.web.servlet.mvc.GrailsParameterMap)值:[[controller:user,   格式:null,操作:saveAjax]]可能的解决方案:   保存(com.vogella.grails.guestbook.User),wait(),any(),wait(long),   any(groovy.lang.Closure),isCase(java.lang.Object)

package com.vogella.grails.guestbook

class User {
    String name
    String last
    static constraints = {
    name (blank:false, nullable:false, size:3..30, matches:"[a-zA-Z1-9_]+")
    }

    String toString(){
        return name;
    }
}

控制器

package com.vogella.grails.guestbook

import grails.validation.ValidationException
import static org.springframework.http.HttpStatus.*

class UserController {

    UserService userService

    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
    static scaffold = User

        def saveAjax(params) {
            render params
            userService.save(params)
            render "Success!"

        }
}

GSP

<!doctype html>
<html>
<head>
    <meta name="layout" content="main"/>
    <title>Welcome to Grails</title>

     <g:javascript library='jquery' />

</head>
<body>


<g:form id = "my_awesome_form">
<g:textField id = "box1" name="mytextbox"/>
<g:textField id = "box2" name="mytextbox2"/>
<input type="button" id = "mybutton" onclick="changeName()" value="create user"/>
</g:form>   
<div id="resultDiv"></div>     

<script>
function changeName()
    {   event.preventDefault();
        $.ajax({
            url:"<g:createLink url="[action:'saveAjax',controller:'User']" />",
            dataType: "json",
            type:"post",
            data: $('#my_awesome_form').serialize(),
            success: function() {
                    $( "#resultDiv" ).addClass( 'alert alert-info' ).append( 'Successfully saved event' )
            }, 
            error: function(xhr, status, error) {
                 $( "#resultDiv" ).addClass( 'alert alert-info' ).append(xhr.responseText);
            }
        });
    }
</script>

</body>
</html>

通过

传递数据时尝试调用params.box1时
  

$('#my_awesome_form')。serialize();

我收到:

  

由方法歧义导致的方法重载   grails.artefact.controller.support.ResponseRenderer $ Trait $ Helper#render。   无法解析为[class调用的方法   com.vogella.grails.guestbook.UserController,null]由于重叠   原型之间:[接口   grails.artefact.controller.support.ResponseRenderer,接口   java.lang.CharSequence] [接口   grails.artefact.controller.support.ResponseRenderer,接口   java.util.Map]

1 个答案:

答案 0 :(得分:0)

该错误表明您正在将映射params传递给userService save对象的User方法,您可以更改userService save方法的实现,使其接受地图或像这样通过地图:

userService.save( new User( params ) )

这假设表单中的字段ID与User域中的字段名称匹配,因此Grails可以bind them(如果不更改它们以匹配)(容易得多),否则您将不得不手动将它们设置为:

def user = new User()
user.name = params.box1
...