2012-03-17 62 views

回答

4

操作可以使用chain controller method進行鏈接。

鏈接允許將模型從一個動作保留到下一個動作。

0

(遲到了,但是......)我使用的Grails 2.4.4,它允許我做如下:

def usernameLogin() { 
    SecurityToken securityToken = authService.loginWithUserPass(params.user, params.pass) 
    chain action: 'afterLogin', model: [securityToken: securityToken] 
} 

def ssoLogin() { 
    SecurityToken securityToken = authService.ssoLogin(params.remoteUser, params.key) 
    chain action: 'afterLogin', model: [securityToken: securityToken] 
} 

def afterLogin() { 
    SecurityToken securityToken = (SecurityToken) chainModel['securityToken'] 
    if (securityToken.valid) { 
    forward action: 'loggedInRedirect' 
    } 
    else { 
    forward action: 'loginFailed' 
    } 
} 
  • SecurityToken是包含字符串和枚舉對象
  • 密鑰使用源動作「鏈動作」,2)使用在chainModel目標動作

希望這有助於爲1)。

0

較早的答案不完整。所以,我正在將它們與我的輸入一起編譯並使它們更清晰。

你有兩個選擇:

  1. 鏈接的行動:

    def action1() = { 
        DomainClass domainInstance = DomainClass.findById(params.id); 
        chain (action: 'action2', model: [domainInstance: domainInstance]); 
    } 
    
    def action2() = { 
        DomainClass domainInstance = chainModel?.domainInstance ?: DomainClass.findById(params.id); 
        [domainInstance: domainInstance]; 
    } 
    

    然而,繼任者的行動似乎使用一個新的數據庫會話 不是重用的前身(可能也可以在Grails中配置爲 ,但我不知道如何)。因此任何延遲加載的實體可能不會完全加載到後續操作中,並且 可能會給LazyInitializationException(當然取決於您的ORM配置)。

  2. 轉發請求:

    def action1() = { 
        DomainClass domainInstance = DomainClass.findById(params.id); 
        forward (action: 'action2', model: [domainInstance: domainInstance]); 
    } 
    
    def action2() = { 
        DomainClass domainInstance = request?.domainInstance ?: DomainClass.findById(params.id); 
        [domainInstance: domainInstance]; 
    } 
    

不同於前面的情況,請求轉發重新使用現有的會議,以便延遲加載的問題不會發生。

正如您所看到的,兩者的語法幾乎完全相同。但是,由於上述問題,您應該根據相關要求轉發請求轉發。另一個重要的細節是關於在頁面加載時/之後在地址欄中查看的URL。轉發請求將保留頁面URL,同時鏈接操作會將頁面URL更改爲最新操作的頁面URL。

相關問題