Jos*_*ith 7 ruby-on-rails ember.js
我试图通过这种方式将顶级路由从我的Rails API工作到Ember.js客户端(例如,类似于GitHub的工作原理):
点击www.example.com/username会给你一个用户的页面.这可能会击中api.example.com/users/:username端点或其他端点.
点击www.example.com/organization_name会给你一个组织的页面.这可能会击中api.example.com/organizations/:organization_name端点或其他端点.
获取随机URL时,客户端显然不知道它正在处理什么类型的模型.它只是把它当作www.example.com/random_string,其中random_string可以是一个username或一个organization_name.
我不太清楚如何处理这种情况.目前还不清楚客户端或服务器的责任在哪里.我可以想象也许某种多态性在这里工作,但无法连接点.
编辑
看起来这似乎可以在Rails端通过一个catch-all路由/:slug然后使用slug来首先查询a User,然后查询一个Organization.
因此,更大的问题是,通过使用现有的控制器操作进行渲染,还是让HTTP通过重定向来处理这些请求是否有意义.会ember-data很好地处理HTTP重定向吗?在另一种情况下,它是否能够在此端点上正确切换类型?
看起来这在 Rails 方面表面上是可能的,通过为 /:slug 设置一个包罗万象的路由,然后使用 slug 首先查询用户,然后查询组织。
这是唯一可行的方法。您需要在config/routes.rb文件的最后添加此包罗万象的路线。我建议您将此路由与控制器中的代理方法相关联,该方法将确定 aUser或一条Organization记录是否对应于slug.
知道当 aUser和 anOrganization相同时你必须考虑应用程序的操作slug(有些会优先考虑其中一个,有些会给访问者提供 2 个选择);以及没有记录对应时要采取的操作slug(有些会显示 404,有些会路由到列表页面)。这些选择将帮助您确定代理方法的更好设计。
这里主要就是设计这个代理方法。
1-HTTP 重定向
您的代理redirect_to方法将响应/users/:slug或/organizations/:slug,具体取决于从slug.
2- Ajax 响应
与 HTTP 重定向类似,但在 AJAX 中完成。您的代理方法将显示一个包含 JavaScript 代码的页面,该代码获取/users/:slug或/organizations/:slug的内容并通过 AJAX 显示它。
另外,JavaScript 可以使用以下命令更改 URLhistory.pushState
3-服务器端代理
您的代理方法将执行与端点方法相同的代码。这意味着如果发现slug对应于一条User记录,则代理方法将执行与 相同的操作UserController#show。(同样适用于Organization)
这意味着代理方法必须调用所有之前/之后的过滤器UserController#show,并呈现相同的视图。
如果您选择此解决方案进行 DRY,请务必小心。或者您最终可能会难以维护您的应用程序。
没有单一的方法可以做到这一点,这完全取决于您的应用程序架构。例如,如果您的show方法只是获取记录并渲染视图,并且没有控制器辅助方法,那么它就很简单且安全。另一方面,如果您有过滤器和控制器辅助方法,那么它会变得更加棘手。在这种情况下,您可能需要依赖控制器关注点。