3 つのドメイン間の保存アクションを検証する必要があります。関係は次のとおりです。
ユーザー - JobProcess : 1 対多、JobProcess - ヒートマップ : 1 対多。
User { static hasMany = [ jobs : JobProcess ] ... }
JobProcess { static hasMany = [ heatmaps : Heatmap ] ... User script ... }
Heatmap { static belongsTo = JobProcess ... JobProcess job ... }
私は例外を使用して検証フローを制御しています。これが私の検証クラスです:
class ValidationException extends RuntimeException {
Object invalidObject
ValidationException(String message, Object invalidObject) {
super(message)
this.invalidObject = invalidObject
}
}
また、ヒートマップ操作を抽象化するサービス クラスを作成します (そして、params データをオブジェクトにバインドします)。
def addJob(params) {
def user = User.findById(params.user_id)
if (user) {
def heatmap = new Heatmap(params)
def process = new JobProcess(params)
process.addToHeatmaps(heatmap)
user.addToJobs(process)
if (user.save()) {
return heatmap
} else {
throw new ValidationException("Invalid form", heatmap )
}
}
}
そして私のコントローラー:
try {
def heatmap= HeatmapService.addJob(params)
flash.message = "Running new process : $heatmap.job}"
redirect(uri:'/')
} catch (ValidationException che) {
flash.message = "Validation Failed ${che.message}"
render(view:'create', model:[heatmap:che.invalidObject])
}
私の最初の問題: user.save() を使用してエラー検証がありません - 検証が実行されないのはなぜですか?
この問題を修正するには、if (user.save()) by : if (heatmap.validate() && user.save()) を購入して更新します。
続行するためのより良い方法はありますか?
私の 2 番目の問題: リダイレクトが無効な投稿の例外をトリガーしていません。
作成ビューにリダイレクトされましたが、すべてのフィールドが空白で (すべてのフィールド情報が失われました)、検証エラーはありません。
それにもかかわらず、私は model:[heatmap:che.invalidObject] を使用しています。
例外を除いて、invalidObject を返しているので、作成ビューには正確な検証エラーが表示されるはずです。どうしたの ?
ありがとう