0

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 を返しているので、作成ビューには正確な検証エラーが表示されるはずです。どうしたの ?

ありがとう

4

1 に答える 1

0

問題が見つかりました。これは GSP ビューが原因で、間違った Bean を使用していました。

<td valign="top" class="value ${hasErrors(bean: heatmapInstance, field: 'project_name', 'errors')}">

それで、ヒートマップに更新したところ、エラー検証が取得されました。

<td valign="top" class="value ${hasErrors(bean: heatmap, field: 'project_name', 'errors')}">

ありがとうビクター。

于 2010-10-22T18:53:34.157 に答える