0

语境

我的应用程序中有不同类型的配置文件。(准确地说是三个)。我想为每种类型的配置文件使用相同的 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

问题

是否可以为这 3 个配置文件使用相同的 url(即。/dashboard)?

4

4 回答 4

4

如果配置文件应该从 URL 的角度隐藏(不是 RESTful ^^)。您可以在 flash 范围或会话一中隐藏它,以了解流的长度。

现在,对于路由部分,又是另一回事了。由于您可以使用“隐藏”值路由(在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 简单地委托给适当的操作。例如:

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这里的使用。如果您想将多个动作组合成一个动作,这是必要的。

于 2013-03-27T05:25:29.003 回答
0

我会使用一个Action处理路线/dashboard并具有三种不同视图的视图,一种用于每种用户。一旦收到请求,他们Action将能够知道哪种用户正在拨打电话,并会以类似Ok(views.html.customerDashboard)的方式进行响应。

于 2013-03-26T12:18:10.767 回答
0

假设这些配置文件以某种形式保存,一个简单的机制是有一个字段来标识它们并使用该字段(来自 table(sql)/document(noSQL))来确定哪些功能应该是活动的或哪些模板要激活利用。

于 2013-03-26T11:41:36.607 回答