在做任何其他事情之前,我建议看一下 Thoughtbot 的Backbone.js on Rails书,这是一个很好的起点,虽然针对中高级读者。我买了这本书,已经使用过 Rails,但作为一个完全的骨干.js 初学者,它对我很有帮助。
除此之外,结合这些框架存在一些基本问题,这些问题超出了本书和其他书籍所涵盖的细节。下面是我建议你考虑的一些事情,根据我自己将 RoR 和backbone.js 配对的经验。这是一个很长的答案,有点偏离你的问题的具体细节,但我希望它可以帮助你理解你所面临的问题的“大局”意识。
Rails:Web 框架与 API
在 Rails 应用程序之上使用 Backbone.js 时,您面临的第一件事是如何处理视图,但这实际上只是更深层次问题的表面。问题的核心在于创建 RESTful Web 服务意味着什么。
Rails 是开箱即用的,routes.rb
通过标准 HTTP 操作根据在统一 URI(在您的文件中定义)访问的一组资源来构建路由,以鼓励其用户创建 RESTful 服务。所以如果你有一个Post
模型,你可以:
- 通过发送
GET
请求获取所有帖子 /posts
- 通过向 发送
GET
请求/posts/new
、填写表单并将其(POST
请求)发送到 来创建新帖子/posts
123
通过向 发送GET
请求/posts/123/edit
、填写表单并将其(PUT
请求)发送到 来更新带有 id 的帖子posts/123
123
通过发送DELETE
请求来销毁带有 id 的帖子/posts/123
关于 Rails 的这方面要记住的关键是它从根本上是无状态的:无论我以前在做什么,我都可以Post
通过将POST
带有有效表单数据的请求发送到正确的 URI(例如 )来创建一个新的/posts
。当然有一些警告:我可能需要登录(有一个会话 cookie 来识别我),但本质上 Rails 并不真正关心我在发送该请求之前在做什么。我可以通过更新另一篇文章来跟进它,或者通过向我可用的任何其他资源发送有效的操作。
Rails 设计的这一方面使得将(Javascript 轻量级)Rails Web 应用程序转换为 API 变得相对容易:资源将相似或相同,Web 框架返回 HTML 页面,而 API(通常)返回数据JSON 或 XML 格式。
Backbone.js:一个新的有状态层
Backbone 也基于 RESTful 资源。每当您创建、更新或销毁 Backbone.js 模型时,您都是通过发送到 URI 的标准 HTTP 操作来实现的,这些 URI 假定采用上述类型的 RESTful 架构。这使其成为与 RoR 等 RESTful 服务集成的理想选择。
但是这里有一个微妙的点需要强调:backbone.js作为 API与 Rails 无缝集成。也就是说,如果你去掉 HTML 视图,只使用 Rails来提供 RESTful 资源,与数据库集成,执行会话管理等,那么它与backbone.js 为客户端提供的结构很好地集成在一起代码。许多人争辩说,以这种方式使用 rails并没有错,我认为在很多方面他们都是对的。
复杂的问题是如何处理我们刚刚丢弃的 Rails 的其他部分:视图及其代表的内容。
有状态的人类,无状态的机器
这实际上比最初看起来更重要。HTML 视图表示人类用于访问您的服务提供的 RESTful 资源的无状态界面。去掉它们会给你留下两个接入点:
- 对于人类:backbone.js 层提供的丰富的客户端接口(有状态)
- 对于机器:rails 层提供的面向资源的 RESTful API(无状态)
请注意,人类不再有无状态(RESTful)界面。相比之下,在带有 API 的传统 Rails 应用程序中,我们有更接近于此的东西:
- 人类的 HTML 资源(无状态)
- 机器的 JSON/XML 资源 (API)(无状态)
为了获得资源后两个接口是很多在本质上比前两者更接近对方。以 rails 的respond_with为例,它利用相似性将各种 RESTful 响应器包装在一个统一的方法中。
合作
这可能看起来都非常抽象,而且离题了,我知道。为了尝试使其更具体,请考虑以下问题,这又回到了有关让 rails 和backbone.js 协同工作的问题。在这个问题中,你想:
- 使用backbone.js 创建一个具有丰富客户端体验的Web 服务,使用rails 作为后端服务JSON 格式的资源。
- 用于
pushState
为应用程序中的每个页面提供一个/posts/123
可以直接访问的 URL(例如)(通过将其输入到浏览器栏中)。
- 对于这些 URL 中的每一个,还为没有 javascript 的客户端提供一个 HTML 页面。
这些对现代 Web 服务的需求并不罕见,但它们带来了复杂的挑战。长话短说,您现在必须创建两个“以人为本”的层:
- 有状态的客户端接口(backbone.js 模板和视图)
- 无状态 HTML 资源(Rails HTML 视图)
实际执行此操作的复杂性导致如今许多人放弃这两者中的后者而仅提供丰富的客户端界面。你决定做什么取决于你的目标和你想要达到的目标,但这个问题值得仔细考虑。
作为另一个可能的参考,我建议查看 O'Reilly 的RESTful Web Services。在关于 Rails 和 Backbone.js 的问题中推荐一本关于 REST 的书似乎很奇怪,但实际上我认为这是将这些非常不同的框架组合在一起的关键部分,更充分地理解它会帮助你利用两者的强项。