【问题标题】:Calling Grails def from Javascript从 Javascript 调用 Grails def
【发布时间】:2025-12-20 02:40:06
【问题描述】:

我正在尝试向一个非常简单的 Grails 方法发出 ajax 请求:

def countRace() {
    Date date = params.date("date", 'yyyy-MM-dd');
    Integer count = Race.countByDate(date);
    log.info("Number of races on " + date + " is " + count);
    return [count : count]
}

我正在使用以下 jQuery 代码来执行此操作:

function updateDayRaceCount(id) {
    $.ajax({
       url: "${g.createLink(controller:'data', action:'countRace')}?date=" + id
    }).done(function(response) {
       alert(response);
    });
}  

我看到日志在服务器上触发,所以我知道该方法正在被命中:

grails.app.controllers.runnerdb.DataController Number of races on Thu Mar 06 00:00:00 GMT 2014 is 38

但是 ajax 请求出错并带有 404。当我观察到错误时,我发现它是Tomcat标准404页面,并且正在生成的URL看起来像这样:

/runnerdb/data/countRace?date=<id here>

被映射到:

 /runnerdb/WEB-INF/grails-app/views/data/countRace.jsp

这就是问题所在,因为我认为 Tomcat 或 grails 正试图呈现一个不存在的视图。

我的问题是……

我如何在 grails 中停止这种仅用于这种方法的行为,并强制它简单地返回 int 值?

【问题讨论】:

    标签: jquery ajax tomcat grails groovy


    【解决方案1】:

    默认情况下,Grails 按约定解析视图。在您的情况下,您将需要使用渲染而不是返回。通过使用 return,您是在告诉 Grails 使用您的 return 作为模型继续处理视图。

    这里是一个渲染文本值的例子:

    render(text: count)
    

    或者,您可能希望将结果呈现为 JSON(前提是您导入转换器):

    render [count: count] as JSON
    

    【讨论】:

    • 立即解决了问题。我发誓,总有一天我会搞定的!