我的控制器中有以下方法,用于列出患者实体:
def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
def roles = springSecurityService.getPrincipal().getAuthorities()
if(roles == 'ROLE_USER')
{
[patientInstanceList: Patient.findAllBySecUser(springSecurityService.getCurrentUser()), patientInstanceTotal: Patient.count()]
}
else if(roles == 'ROLE_ADMIN' || roles == 'ROLE_MANAGER')
{
[patientInstanceList: Patient.list(params), patientInstanceTotal: Patient.count()]
}
}
如果我执行此方法,我有例外
Tag [paginate] is missing required attribute [total]
但是,如果我使用以下
def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
[patientInstanceList: Patient.list(params), patientInstanceTotal: Patient.count()]
}
}
一切都运作良好。我看到了患者创建的所有实例。我只希望根据用户登录的角色,我可以看到创建的所有实体的一部分。为什么会引发此异常?
我在这里发现了Grails pagination tag error类似的东西,但没有给出好的答案
答案 0 :(得分:1)
我不确定你是否可以在if语句中省略return。另一个细节是您在ROLE_USER
中过滤了您的域记录,但计算的总数与此过滤器无关。
您可以尝试这种方法:
def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
def roles = springSecurityService.getPrincipal().getAuthorities()
def model
//I think roles is a list so your equals will not work...
def admin = roles.find { it.authority == 'ROLE_ADMIN' || it.authority == 'ROLE_MANAGER' }
if(admin) {
model = [patientInstanceList: Patient.list(params), patientInstanceTotal: Patient.count()]
} else {
//createCriteria().list(params) will paginate...
def patientInstanceList = Patient.createCriteria().list(params) {
eq('secUser', springSecurityService.currentUser)
}
//totalCount will trigger a query without the limit, but applying your filter
model = [patientInstanceTotal: patientInstanceList.totalCount, patientInstanceList: patientInstanceList]
}
//and finally we return the model
//return model
//just to show that the return is optional
model
}