0

環境

アプリケーションにさまざまなタイプのプロファイルがあります。(正確には3つ)。プロファイルの種類ごとに同じ URL を使用したいのですが、アクションは異なります。例えば ​​:

  • 管理者
  • 企業
  • お客様

プロファイルの各タイプには、さまざまな情報を表示するダッシュボードがあります。/これらのプロファイルごとにルートを使用し、異なるアクションとビューを保持するにはどうすればよいですか?

  • Admins続いてAdmin.dashboard、ユーザー統計、接続統計などを表示します。
  • Customers続き、Customers.dashboard最後のメッセージを表示します。
  • Compagnies続き、Compagnies.dashboard販売統計が表示されます。

ユーザーの各タイプは、セッションのフラグで識別され、データベース呼び出しでサーバー側で確認されます。

解決

これまでに行ったことは、プロファイル タイプごとにルートのプレフィックスを付けることです。

GET /admin/dashboard     Admin.dashboard
GET /customer/dashboard  Customer.dashboard
GET /compangy/dashboard  Compagny.dashboard

質問

/dashboardこれら 3 つのプロファイルに同じ URL (つまり ) を使用することは可能ですか?

4

4 に答える 4

4

プロファイルを URL の観点から非表示にする必要がある場合 (RESTful ではありません ^^)。フローの長さに関して、フラッシュ スコープまたはセッション 1 で非表示にすることができます。

さて、ルーティングの部分については、また別の話です。「隠し」値を使用して (routeファイルで) ルーティングできるため、構成でこれらのルートを表すことはできません。

ただし、プロファイルを抽出して適切なダッシュボードにリダイレクトする Action インターセプターを独自に作成することもできます (これはおそらく最も迅速で汚い方法です)...

最後に、パスでプロファイルを使用できませんでした ;-) ?

GET /dashboard           Dashboard.index
GET /admin/dashboard     Admin.dashboard
GET /customer/dashboard  Customer.dashboard
GET /company/dashboard   Company.dashboard

コントローラー...ただし、必要に応じてさらに呼び出しを行うにはスケーリングしません...

object Dashboard extends Controller {

  def index = Action { implicit request =>
    request.session.get("profile").map {  p =>
      p match {
        case "admin" => Redirect( routes.Admin.dashboard() )
        case "customer" => Redirect( routes.Customer.dashboard() )
        case "company" => Redirect( routes.Company.dashboard() )
      }
    }.getOrElse { 
      Redirect( routes.Customer.dashboard() )
    } 
  }

}
于 2013-03-26T11:58:04.983 に答える
1

ダッシュボードは実際にはリソースではなく、コンテキストに依存するものであるため、他の投稿で示唆されているように、私は休息について心配する必要はありません. したがって、プロファイルがあります。

trait Profile
case object AdminProfile extends Profile
case object CustomerProfile extends Profile
case object CompanyProfile extends Profile

そして、リクエスト ヘッダーからプロファイルを抽出するメソッドがあります。

def extractProfile(rh: RequestHeader): Option[Profile] = rh.session.get("profile").map {
  case "admin" => AdminProfile
  case "customer" => CustomerProfile
  case "company" => CompanyProfile
}

アクションでこれを行うことができます:

def dashboard = Action { req => 
  extractProfile(req).map {
    case AdminProfile => // code here that loads stuff and renders it for admin
    case CustomerProfile => // code here for customer
    case CompanyProfile => // code here for company
  } getOrElse NotFound
}

ただし、管理者が顧客または会社のダッシュボードにアクセスできるようにしたいとしましょう。元の投稿で説明したように、すでに 3 つのルートがあり、必要に応じて特定のルートに移動できます。/dashboard を適切なアクションに委任するだけの 4 番目のアクションを簡単に追加できます。例えば:

def dashboard = EssentialAction { req =>
  extractProfile(req).map {
    case AdminProfile => Admin.dashboard(req)
    case CustomerProfile => Customer.dashboard(req)
    case CompanyProfile => Company.dashboard(req)
  } getOrElse NotFound
}

ここでの使用に注意してEssentialActionください。複数のアクションを 1 つのアクションにまとめたい場合に必要です。

于 2013-03-27T05:25:29.003 に答える
0

これらのプロファイルが何らかの形で永続化されていると仮定すると、単純なメカニズムは、それらを識別するフィールドを持ち、そのフィールドを (テーブル (sql)/ドキュメント (noSQL) から) 使用して、どの機能をアクティブにするか、またはどのテンプレートをアクティブにするかを決定することです。使用する。

于 2013-03-26T11:41:36.607 に答える
0

Actionルートを処理し、/dashboardユーザーの種類ごとに 1 つずつ、3 つの異なるビューを持つものを使用します。リクエストが受信されると、 はどの種類のユーザーが電話をかけているかを知ることができ、たとえばAction次のような応答を返します。Ok(views.html.customerDashboard)

于 2013-03-26T12:18:10.767 に答える