2011-05-16 6 views
1

This question 컨트롤러 클로저에 추가 할 코드가 있습니다.하지만 grails 기본 스캐 폴딩 뷰를 사용하고 싶지만 편집/업데이트 만하고 싶습니다. 사용자가 관리자이거나 도메인 객체가 사용자 소유이면 버튼이 나타 납니까? Reading the documentation는, 나는 시도했다 :Grails는 스프링 보안 코어 만 GSP에서 업데이트 할 수 있습니다.

<sec:access expression="hasRole('ROLE_MANAGER') || (projectInstance.owner == springSecurityService.currentUser)"> 
    <span class="button"><g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /></span> 
</sec:access> 

그러나 액세스 클래스는 논리합을 허용하지 않는 것 :

Error processing GroovyPageView: Error executing tag <g:form>: Error executing tag <sec:access>: Cannot handle (124) '|' 

사람은 비슷한 일을?

답변

3

나는 그것이 어리 석을 것이라고 결정했습니다. 더 나은 방법은 컨트롤러에서 작업을 수행하는 것입니다 후 GSP에서 할

def edit = { 
    def projectInstance = Project.get(params.id) 
    def managerOrAdmin = SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN,ROLE_MANAGER') 
    def editable = (projectInstance.owner == springSecurityService.currentUser 
        || managerOrAdmin) 
    if (!projectInstance) { 
     flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'project.label', default: 'Project'), params.id])}" 
     redirect(action: "list") 
    } 
    else { 
     return [projectInstance: projectInstance, editable:editable] 
    } 
} 

하고, 의미가

<g:if test="${editable}"> 
    <span class="button"><g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /></span> 
</g:if> 

우리는 뷰가 적게해야한다 "의 좋은 프로그래밍 만트라를 따르는 경우 MVC에서 가능한 한 로직 처리 "

+0

표현식이 간단한 역할 검사보다 약간 복잡하기 때문에이 접근 방식에 동의합니다. – Gregg