2013-04-02 4 views
0

Grails 2.2.0을 사용하여 웹 사이트를 만들었으며 최상의 코드/조언을 찾고 있습니다. 이것은 Grails의 첫 번째 사용이며 Groovy와 Grails에 익숙하지만 어떤 정의로든 전문가는 아닙니다. Java + Spring 배경에서 왔습니다.주석을 사용하여 Groovy/Grails 코드가 DRY 상태를 유지할 수 있습니까?

나는 허영 URL을 요구 사항으로 가지고 있습니다. 본질적으로 URI는 필수 모델을 찾는 데 사용됩니다. 발견되지 않으면 홈페이지로 리디렉션하십시오. 그것이 존재하면 컨트롤러 액션의 도우미에서 사용됩니다 (클로저에 의해 지시 된대로, 현재있는 경우에만 실행 됨). BaseController

Group requireGroupFromUrl(Closure c) { 
    if (params.groupName == null) { 
    redirect(controller: "home", action: "index") 
    return 
    } 
    else { 
    Group group = Group.findByUrlName(params.groupName) 
    if (group == null) { 
     redirect(controller: "home", action: "index") 
     return 
    } 

    c.call(group) 
    } 
} 

DashboardController.groovy가 확장 :

UrlMappings.groovy :

"/$groupName/dashboard"(controller: "dashboard", action: "viewAll") 
"/$groupName/dashboard/create"(controller: "dashboard", action: "createRecord") 
"/$groupName/foo/$action?"(controller: "foo") 

BaseController.groovy 여기 내 전류 (작업) 소스의 소독 예입니다

def viewAll() { 
    requireGroupFromUrl({ Group group -> gymHelper(group)}) 
} 

def viewAllHelper(Group group) { 

    // some logic involving 'group' 

    def map = [groupInstance: group, /* OTHER CALCULATED/QUERIED PARAMS*/ ] 
    render(view: "/groupView", model: map) 
} 

이것은 작동합니다. 그러나 도우미 메서드가 필요없는 kludgy로 보인다.

한 눈에 보면 필터가 작업을 수행 할 수 있지만 필터 (/,/login,/register 등)에서 제외 할 경로를 지정해야합니다. UrlMappings의 항목과 결합됩니다. 아니면 여러 패턴과 함께 uri을 사용할 수 있습니까? 예 : uri: '*/dashboard/**, */foo/**'? 어떻게 검색된 객체를 전달할 수 있습니까?

적용 가능한 컨트롤러 동작 만 주석으로 처리하는 Around 조언을 사용하여 주석을 사용하면 더 나은 결과를 얻을 수 있습니까? 그렇다면, 애스펙트는 redirect로 전화 할 수 있습니까? 검색된 객체를 주석 처리 된 컨트롤러 작업으로 어떻게 전달할 수 있습니까? 즉

@GroupRequired 
def viewAll() { 
    ... 
} 
+0

나는'/ $ groupName'가 그대로 URI 패턴이 어려울 것으로, 필터를 실험하기 시작하면서, 지난 밤에 실현 내 응용 프로그램에서 유효한 경로. – Mike

답변

2

컨트롤러 beforeInterceptor는 완전히이 작업을 수행 할 수 있습니다

abstract class BaseController { 
    def beforeInterceptor = { 
     if (params.groupName == null) { 
      redirect(controller: "home", action: "index") 
      return false 
     } 

     Group group = Group.findByUrlName(params.groupName) 
     if (group == null) { 
      redirect(controller: "home", action: "index") 
      return false 
     } 

     // put the group into the params object 
     // for use in the controllers 
     params.group = group 
    } 
} 

class ChildController extends BaseController { 
    def myAction() { 
     Group g = params.group 

     // do things 
    } 
} 
관련 문제