ajaxリクエストがあるときにレイアウトを変更したい。だから私はそのためのフィルターを設定します:
class AjaxFilters {
def filters = {
ajaxify(controller: '*', action: '*') {
after = { Map model ->
if(model==null) {
model = new HashMap()
}
// only intercept AJAX requests
if (!request.xhr) {
model.put("layout", "mainUsers")
return true
}
// find our controller to see if the action is ajaxified
def artefact = grailsApplication
.getArtefactByLogicalPropertyName("Controller", controllerName)
if (!artefact) { return true }
// check if our action is ajaxified
def isAjaxified = artefact.clazz.declaredFields.find {
it.name == 'ajaxify'
} != null
def ajaxified = isAjaxified ? artefact.clazz?.ajaxify : []
if (actionName in ajaxified || '*' in ajaxified) {
model.put("layout", "ajax")
return false
}
return true
}
}
}
}
これにより、使用するレイアウトを定義する「layout」という名前のビューモデルが作成されます。
レイアウトモデルを使用するビューの例を次に示します。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<meta name="layout" content="${layout}"/>
<title>Profile</title>
</head>
<body>
<h3>Edit Profile</h3>
</body>
</html>
これはコントローラーです:
class SettingsController {
def springSecurityService
static ajaxify = ["profile", "account"]
def profile() {
User user = springSecurityService.currentUser
UserProfile profile = UserProfile.findByUser(user)
if(profile == null) {
flash.error="Profile not found."
return
}
[profile: profile, user: user]
}
}
通常のリクエストは期待どおりに機能しますが、ajaxリクエストを試してみると、応答は完全に空になっています。ヘッダーのみが送信されます。