1

在 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 请求的用户对象?

4

1 回答 1

1

要同时支持 ajax 和非 ajax 请求,您必须进行一些内容协商并返回相应的响应。这是直接来自文档的示例:

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
  • 您是否为两个 ajax/非 ajax 调用传递了相同的参数(例如用户 ID)

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

于 2013-07-23T14:57:31.300 回答