如何在Grails的Ajax请求中使用afterInterceptor?

时间:2013-07-23 14:14:44

标签: grails grails-2.0 grails-controller

在Grails控制器中使用afterInterceptor时,我会这样做

def afterInterceptor = [action: trackPageView, only: 'show']


private trackPageView = { model ->
  // so something
}

def show() { 
  def user = User.get(params.id)
  if (request.xhr)
     render view:'show', model: [user: user]
  else 
     [user: user]
}

这非常适用于非ajax请求,但在Ajax请求上,模型总是[:]。

如何在trackPageView中获取Ajax请求的用户对象?

1 个答案:

答案 0 :(得分:1)

要同时支持ajax和非ajax请求,您必须执行一些content negotiation并返回相应的响应。以下是文档中的示例:

import grails.converters.JSON
import grails.converters.XML

class BookController {
  def list() {
    def books = Book.list()

    withFormat {
      html bookList: books
      json { render books as JSON }
      xml { render books as XML }
    }
  }
}

更新:我会将原始答案保留为参考和上下文。以下是对您预期问题的回答/建议。

假设您的非ajax调用正在运行,并且您能够从传递到trackPageView闭包的模型中获取用户对象,您是否可以确认以下内容:

  • 你在ajax和非ajax调用
  • 上调用完全相同的url
  • 你是否传递了相同的参数(例如用户ID)以进行ajax / non-ajax调用

如果两者都是,那么从技术上讲,你应该在trackPageView内有一个用户对象的模型,因为1)你正在调用相同的方法,2)从ajax / non-ajax传入相同的参数调用