2

Webフォームで制約を使用していますが、いくつかのフォームで同様の検証が行われていることに気付きました。たとえば、開始日と終了日を持ついくつかのタイプのフォームがあります。いずれの場合も、開始日が終了日より前であることを検証したいと思います。フォームから作成しているケースクラスは次のとおりです。

   case class OrderSearchForm(orderId: Option[Int], startDate:Option[Long], endDate:Option[Long])

そして私の検証(今のところ.get()を無視しましょう):

  def validateSearchDate = Constraint[OrderSearchForm]{ 
    osf: OrderSearchForm => {
      if (!osf.startDate.isEmpty && !osf.endDate.isEmpty && osf.startDate.get.compareTo(osf.endDate.get) > 0 )
        Invalid("Begin Date is after End Date.")
      else
        Valid
    }
  }

開始日と終了日が記載されたフォームがたくさんあるので、これらのフォームを表すすべてのケースクラスで機能するように検証を書き直したいと思います。タイプクラスパターンがこれに役立つかどうか疑問に思っています:

trait TwoDates[T] { 
  def twoDatesTuple(t: T): (Option[Long], Option[Long]) 
}

trait TwoDatesOSF extends TwoDates[OrderSearchForm] { 
  def twoDatesTuple(t: OrderSearchForm) = (t.startDate, t.endDate) 
}

implicit object TwoDatesOSF extends trait TwoDatesOSF

def validateSearchDate = Constraint[TwoDates[_]] { t: TwoDates[_] => ... (as above)}

しかし、適用は機能しません:

validateSearchDate(OrderSearchForm(None, None, None))

収量:

エラー:タイプの不一致。見つかった:OrderSearchFormが必要:TwoDates [_] betweenDates(osf)

1)型クラスを使用して一般的な検証を記述できますか?もしそうなら、私は何を間違っていますか?

2)スーパークラスを使用して回避しながら一般的な検証を記述できますか(つまり、

abstract class TwoDates(start: Option[Long], end:Option[Long])

case class OrderSearchForm(orderId: Option[String], startDate:Option[Long], endDate:Option[Long]) extends TwoDates(startDate, endDate) 

複数の検証が行われると、これは厄介なようです)

ありがとう!

4

1 に答える 1

1

構造型を使用できると思います。

private type TwoDates = { def startDate: Option[Date]; def endDate: Option[Date] }

def validateTwoDates = Constraint[TwoDates] { osf: TwoDates =>
if (!osf.startDate.isEmpty && 
    !osf.endDate.isEmpty && 
    osf.startDate.get.compareTo(osf.endDate.get) > 0) {
        Invalid("Begin Date is after End Date.")
    } else Valid
}

case class Something(
   startDate: Option[Date], 
   endDate: Option[Date], 
   name: String)

private val form = Form(mapping(
   "startDate" -> optional(date),
   "endDate" -> optional(date),
   "name" -> text)
(Something.apply)(Something.unapply).verifying(validateTwoDates))
于 2013-02-08T17:26:00.713 に答える