【问题标题】:Grails formRemote 404 Not FoundGrails formRemote 404 Not Found
【发布时间】:2015-06-04 16:30:51
【问题描述】:

我无法让我的 ajaxform 正常工作。我正在使用 Grails 2.4.4 并具有以下 remoteForm 代码。

查看二手产品

<div id="updateMe">
    <g:each in="${productList}" var="product">
        ${product.item} Success1
    </g:each>
</div>

<g:formRemote name="myForm"
    url="[controller:'product', action: 'save']" update="updateMe">
    <g:textField name="item" required="" value="${newProduct?.item}" />
    <g:submitButton name="Save" />
</g:formRemote>

控制器产品控制器

def usedProducts = {
    [productList:Product.findAll()]
}

@Transactional
def save(Product productInstance) {
    productInstance.save flush:true

    [productList: Product.findAll()]
}

控制台错误

发布http://localhost:8080/TekDays/product/save

404 未找到 54毫秒
jquery-...e=false(第 9631 行) "NetworkError: 404 Not Found - http://localhost:8080/TekDays/product/save"

【问题讨论】:

  • 您有一个名为 save.gsp 的文件吗?请注意,方法 save(控制器)将模型返回到需要具有相同名称的 gsp:save。

标签: grails


【解决方案1】:

恐怕你不能这样做。

请注意,当用户有效地执行 AJAX 调用时,将不再有 GSP 标记。只有 CSS、HTML 和 Javascript。这是浏览器的世界。

请把渲染放在你要返回和测试的前面。

@Transactional
def save(Product productInstance) {
    productInstance.save flush:true    
    render Product.findAll()   
}

您会看到 DIV updateMe 的内容将被 save 方法呈现的内容所替换。内容是 findAll 方法返回的包含所有 Product 对象的列表。

当您使用渲染时,返回的内容(GSP 模板、变量的内容或 HTML)将在当前 HTML 中渲染,例如,通过 AJAX 调用。

对于另一方,当您使用 return 关键字时,需要一个与控制器方法同名的 GSP。因此,您会收到 404,因为未找到 save.gsp。注意:如果你省略了 return 关键字(就像你正在做的那样),那么 groovyc(Groovy 编译器)会隐式地为你提供它。

如果我完全理解您要执行的操作,那么您必须渲染内容(而不是返回)。

【讨论】:

  • 所以我看起来好像渲染解决了这个问题,我现在唯一遇到的问题是我在列表中的对象只显示域包。例如 [com.tekdays.Product : 1, com.tekdays.Product : 2, com.tekdays.Product : 3, com.tekdays.Product : 4] 有什么想法吗?
  • @CodeJunkie 您正在渲染 Grails 域对象的 .toString() 的返回,它是类名,后跟对象的数据库 ID(com.tekdays.Product : 1)。如果您想呈现您的类的属性,请尝试执行以下操作: Product.findAll().property(将 .property 替换为您的域类的某些属性)。
  • 我对来自 Tapestry 的 Grails 非常陌生。 Tapestry 的概念是,您可以在模板中用区域包围您的列表,当该区域刷新时,它会使用来自后端的新对象刷新您的模板列表。如果我对 grails 的理解正确,情况并非如此,grails 无法将您的对象数据传递给每个,您将需要按照您刚才所说的手动执行或创建模板?再说一次,对于 grails 来说还是很陌生的。
  • @CodeJunkie,你可以直接渲染一个值。示例:渲染 Product.findAll()。您可以直接渲染 HTML sn-p。示例:渲染“${Product.findAll()}”。最后,您可以渲染 GSP 模板。示例:render(template:"bookTemplate", model:[book:b]),其中 bookTemplate 是必须以下划线字符开头的 GSP:_bookTemplate.gsp。模板是一种非常灵活的代码重用方式,因此强烈推荐使用模板(参见:stackoverflow.com/questions/18272250/…)。
  • @CodeJunkie,我忘了说你可以从另一个 GSP 渲染 GSP 模板,例如:。我强烈建议您阅读有关 GSP 模板的更多信息,因为它是 Grails 框架的一项强大功能。
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2014-01-25
  • 2015-06-27
  • 2021-12-27
  • 1970-01-01
  • 2019-05-12
  • 2020-08-19
  • 2017-05-11
相关资源
最近更新 更多