2016-11-06 5 views
0

私は、コントローラのメソッドは次のように見えるサービスメソッドを呼び出しますgrailsで削除機能を実装する正しい方法は?

コントローラメソッド

def deletemap(Long id){ 


    try { 

     mapService.deleteMap(id) 

    } 
    catch (ValidationException e) { 


     flash.message = "Sorry an error occured when deleting map!!" 

     redirect(action: "maps", id: event.id) 

     return 


    } 


    flash.message = "Map was deleted!!" 

    redirect(action: "maps", id: event.id) 

    return 


} 

ようになり、削除する方法があります。

サービスメソッド

def deleteMap(id){ 


    def map = Map.get(id) 



    if(map == null){ 

      throw new org.springframework.security.access.AccessDeniedException("Id doesn't exist!!!") 
      return 
    } 



    map.delete(flush: true) 

} 

この機能を可能な限り完璧に実装することが目標です。私は現在、いくつかのテストを書いており、map.delete(flush:true)が失敗したときにテストのケースを処理する必要があるかどうか疑問に思っています。このゴームコールが失敗した場合はありますか?私は助けていただきありがとうございます!ありがとう!

答えて

1

それを行うにはきれいな方法:

コントローラ

def deletemap(Long id){ 

    Map mapInstance = Map.get(id) 

    if (!mapInstance) { 
     flash.message = "Map not found" 
    } 
    else { 
     mapService.deleteMap(mapInstance) 
     flash.message = "Map was deleted!!" 
    } 

    redirect(action: "maps") 
} 

サービス

def deleteMap(Map mapInstance){ 
    map.delete(flush: true) 
} 

Mapは、他のドメインとの関係を持っている場合、それは失敗します。この場合、関係が存在するかどうかを検証し、関係が存在するかどうかを確認するか、関係が削除を妨げることをユーザに伝える必要があります。しかしそれはあなたのドメイン設計に依存します。

+0

サービスメソッドで削除が失敗した場合も対応してはいけません。つまり、このコードがmap.delete(flush:true)に失敗した場合や例外をスローした場合あなたのソリューションは、削除が成功した場合のみケースを処理します。私が間違っている場合は私を修正してください。ありがとう! – kofhearts

+0

データベース接続が失われた場合にtry/catchを追加することはできますが、その場合、アプリが完全にダウンする可能性があります。私の答えは、2つのケースがあります:インスタンスが見つからず、インスタンスが別の関係で使用されています。 – rvargas

+0

私はフラッシュが必須ではないと仮定します。 delete()も目的を満たしますか? – kofhearts

関連する問題