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