ルートを再利用するカスタムディレクティブを作成するにはどうすればよいですか?

コニー・ドブス

複数のシナリオで再利用したいルートスニペットがあります。

val dirSegment = "licenses"
path( dirSegment ~ PathEnd ) {
  redirect( dirSegment + "/", StatusCodes.MovedPermanently ) 
} ~ 
pathPrefix(dirSegment) { 
  path("") {
    /* do something */
  }
}

これをディレクティブ(またはパラメーター化可能なルート?)に変換したいと思います。ここで、dirSegmentvalの値とpath("") { /* do something */ }、リダイレクト動作を保持する白の代わりに任意の追加のルーティング/コードを指定できます。次のようになります。

directoryPath("licenses") {
  path("") {
    /* do something */
  }
} ~ 
directoryPath("about") {
  path("") {
    /* do somthing else */
  }
}

一方、それはすべての繰り返しなしで以下と同等の動作をします:

val dirSegment = "licenses"
val anotherDir = "About"

path( dirSegment ~ PathEnd ) {
  redirect(dirSegment + "/", StatusCodes.MovedPermanently ) 
} ~ 
pathPrefix(dirSegment) { 
  path("") {
    /* do something */
  }
} ~
path( anotherDir ~ PathEnd ) {
  redirect(anotherDir + "/", StatusCodes.MovedPermanently ) 
} ~ 
pathPrefix(anotherDir) { 
  path("") {
    /* do something else */
  }
}

この質問は、スプレールーティングでURLの末尾にスラッシュを自動的に追加するにどうすればよいですか?の議論の一部に触発されたことに注意してください

アンディ

このためのカスタムディレクティブを作成する必要があります。

// additional imports you may need
import shapeless.HNil
import spray.http.StatusCodes
import spray.routing.Directive0
import spray.routing.PathMatcher

さて、それは邪魔になりません:

/**
 * Spray's PathEnd matches trailing optional slashes... we can't have that
 * otherwise it will cause a redirect loop.
 */
object PathEndNoSlash extends PathMatcher[HNil] {
  def apply(path: Path) = path match {
    case Path.Empty ⇒ PathMatcher.Matched.Empty
    case _          ⇒ PathMatcher.Unmatched
  }
}

/**
 * Custom directive that uses a redirect to add a trailing slashe to segment
 * if the slash isn't present.
 */
def directoryPath(segment: String) = new Directive0 {
  def happly(f: HNil ⇒ Route) =
    // first, the redirect
    pathPrefix(segment ~ PathEndNoSlash) {
      redirect("/" + segment + "/", StatusCodes.MovedPermanently) } ~
    // delegate actual work to nested directives
    pathPrefix(segment).happly(f)
}

使用法:

directoryPath("about") {
  path("a") {
    complete {
      "this is /about/a"
    }
  } ~ path("b") {
    complete {
      "this is /about/b"
    }
  } ~ path(PathEnd) {
    complete {
      "this is /about/"
    }
  }
}

ユーザーがにアクセスすると/about、に転送され/about/、「これは/ about /です」と表示されます。ネストされた経路ab期待どおりに動作し(彼ら自身のリダイレクトせずに、です)。

注:このソリューションはSpray1.2用です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

別のディレクティブをラップする再利用可能なコンポーネントAngularディレクティブで、モデルを「パススルー」するにはどうすればよいですか?

分類Dev

anglejsカスタムディレクティブのテンプレートで属性値を取得するにはどうすればよいですか?

分類Dev

カスタムディレクティブでメソッドをトリガーするにはどうすればよいですか?

分類Dev

角度5で「構文として」有効にしたカスタムディレクティブを作成するにはどうすればよいですか?

分類Dev

ng-modelに似たカスタムディレクティブを作成するにはどうすればよいですか?

分類Dev

Angular 2.0でカスタム検証ディレクティブ(つまり、検証用の属性)を作成するにはどうすればよいですか?

分類Dev

React 16.9でカスタム属性(ディレクティブ)を作成するにはどうすればよいですか?

分類Dev

角度js1.xでカスタムディレクティブ実行関数を作成するにはどうすればよいですか?

分類Dev

カスタムプログラムをインストールするディスクを作成するにはどうすればよいですか?

分類Dev

入力のカスタムディレクティブから、親フォームを無効にするにはどうすればよいですか?

分類Dev

入力データ値をangular-2のカスタムディレクティブに送信するにはどうすればよいですか?

分類Dev

他のカスタムディレクティブの要素タグを別のカスタムディレクティブのテンプレートとして使用するにはどうすればよいですか?

分類Dev

未使用のカーネルを削除し、VM内のディスクスペースを再利用するにはどうすればよいですか?

分類Dev

#Angular2カスタム属性ディレクティブの数をカウントするにはどうすればよいですか?

分類Dev

AngularJSディレクティブを使用して、あるディレクティブから別のディレクティブにカスタムモデルを渡すにはどうすればよいですか?

分類Dev

選択リストのカスタムディレクティブにng-changeを実装するにはどうすればよいですか?

分類Dev

カスタムAngularディレクティブでng-modelスコープ値を変更するにはどうすればよいですか?

分類Dev

UIビュー内にカスタムディレクティブを表示するにはどうすればよいですか?

分類Dev

非エンティティテーブルを使用してSpring Bootでカスタム@Queryを作成するにはどうすればよいですか?

分類Dev

sqlalchemyの別のディレクトリのモデルクラスからテーブルを作成するにはどうすればよいですか?

分類Dev

モーセのmgizaにカスタムブーストディレクトリを指定するにはどうすればよいですか?

分類Dev

カスタムフィールドのManyToManyリレーションテーブルをクエリするにはどうすればよいですか?

分類Dev

Ionic 2で、Ionicコンポーネントを使用するカスタムディレクティブを作成するにはどうすればよいですか?

分類Dev

Angularの$ resourceを介してカスタムディレクティブから入力値を送信するにはどうすればよいですか?

分類Dev

ng-templateおよびngIfでカスタムディレクティブを使用するにはどうすればよいですか?

分類Dev

IDを使用してアプリケーションで使用されている状態を変更するカスタムディレクティブをAngularjsで作成するにはどうすればよいですか?

分類Dev

カスタムディレクティブで式を計算可能にするにはどうすればよいですか?(angularjs)

分類Dev

カスタムフックを入力して再利用するにはどうすればよいですか

分類Dev

ファイルシステムでディレクトリなど、ビン、ブートを確認するにはどうすればよいですか?

Related 関連記事

  1. 1

    別のディレクティブをラップする再利用可能なコンポーネントAngularディレクティブで、モデルを「パススルー」するにはどうすればよいですか?

  2. 2

    anglejsカスタムディレクティブのテンプレートで属性値を取得するにはどうすればよいですか?

  3. 3

    カスタムディレクティブでメソッドをトリガーするにはどうすればよいですか?

  4. 4

    角度5で「構文として」有効にしたカスタムディレクティブを作成するにはどうすればよいですか?

  5. 5

    ng-modelに似たカスタムディレクティブを作成するにはどうすればよいですか?

  6. 6

    Angular 2.0でカスタム検証ディレクティブ(つまり、検証用の属性)を作成するにはどうすればよいですか?

  7. 7

    React 16.9でカスタム属性(ディレクティブ)を作成するにはどうすればよいですか?

  8. 8

    角度js1.xでカスタムディレクティブ実行関数を作成するにはどうすればよいですか?

  9. 9

    カスタムプログラムをインストールするディスクを作成するにはどうすればよいですか?

  10. 10

    入力のカスタムディレクティブから、親フォームを無効にするにはどうすればよいですか?

  11. 11

    入力データ値をangular-2のカスタムディレクティブに送信するにはどうすればよいですか?

  12. 12

    他のカスタムディレクティブの要素タグを別のカスタムディレクティブのテンプレートとして使用するにはどうすればよいですか?

  13. 13

    未使用のカーネルを削除し、VM内のディスクスペースを再利用するにはどうすればよいですか?

  14. 14

    #Angular2カスタム属性ディレクティブの数をカウントするにはどうすればよいですか?

  15. 15

    AngularJSディレクティブを使用して、あるディレクティブから別のディレクティブにカスタムモデルを渡すにはどうすればよいですか?

  16. 16

    選択リストのカスタムディレクティブにng-changeを実装するにはどうすればよいですか?

  17. 17

    カスタムAngularディレクティブでng-modelスコープ値を変更するにはどうすればよいですか?

  18. 18

    UIビュー内にカスタムディレクティブを表示するにはどうすればよいですか?

  19. 19

    非エンティティテーブルを使用してSpring Bootでカスタム@Queryを作成するにはどうすればよいですか?

  20. 20

    sqlalchemyの別のディレクトリのモデルクラスからテーブルを作成するにはどうすればよいですか?

  21. 21

    モーセのmgizaにカスタムブーストディレクトリを指定するにはどうすればよいですか?

  22. 22

    カスタムフィールドのManyToManyリレーションテーブルをクエリするにはどうすればよいですか?

  23. 23

    Ionic 2で、Ionicコンポーネントを使用するカスタムディレクティブを作成するにはどうすればよいですか?

  24. 24

    Angularの$ resourceを介してカスタムディレクティブから入力値を送信するにはどうすればよいですか?

  25. 25

    ng-templateおよびngIfでカスタムディレクティブを使用するにはどうすればよいですか?

  26. 26

    IDを使用してアプリケーションで使用されている状態を変更するカスタムディレクティブをAngularjsで作成するにはどうすればよいですか?

  27. 27

    カスタムディレクティブで式を計算可能にするにはどうすればよいですか?(angularjs)

  28. 28

    カスタムフックを入力して再利用するにはどうすればよいですか

  29. 29

    ファイルシステムでディレクトリなど、ビン、ブートを確認するにはどうすればよいですか?

ホットタグ

アーカイブ