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