2013-04-02 60 views
0

我使用Grails 2.2.0來站起來一個網站,我正在尋找最佳做法/建議讓我的代碼保持乾爽。這是我第一次使用Grails,我對Groovy和Grails都有一些熟悉,但我不是任何定義的專家。我來自Java + Spring背景。可以使用註釋來保持Groovy/Grails代碼的乾淨?

我有虛榮網址作爲要求。本質上,URI被用作查找所需模型的關鍵。如果找不到,請重定向到首頁。如果它確實存在,它將用於控制器動作的幫助器中(按照閉包的指示,只有當存在時才執行)。這是我的當前(工作)源的消毒例如:

UrlMappings.groovy:

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

BaseController.groovy:

DashboardController.groovy延伸BaseController:

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) 
} 

這有效。然而,似乎很需要輔助方法。

從一眼看來,似乎過濾器可以做這項工作,但我需要指定哪些路徑將被排除在過濾器(/,/登錄,/註冊等),似乎保持它緊緊加上UrlMappings中的條目。或者我可以用多種模式以某種方式使用uri?例如uri: '*/dashboard/**, */foo/**'?我怎樣才能將檢索到的對象向前傳遞?

這個反而可以更好地實現一個註解,使用Around建議只註釋適用的控制器操作?如果是這樣,可以通過撥打電話redirect?如何將檢索到的對象傳遞給註釋的控制器操作?即

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

昨晚我意識到,當開始使用過濾器進行試驗,該URI模式將是困難的,因爲'/ $ groupName'是在我的應用程序中有效的路徑。 – Mike

回答

2

A控制器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 
    } 
}