35

我刚刚开始研究 MVC 结构,首先我研究了它是如何backbone.js工作的,现在我刚刚完成了 Code School 的rails for zombies。我知道我没有深入研究任何这些,但我有一个问题要开始。

你可以一起使用这些库吗?

我已经学会了如何在两者中创建modelsviews等等,但是在创建真正的应用程序时,您是否同时使用主干和导轨?

如果是这样的话...

您何时使用backbone.js模型与rails模型?

也许我只是超越了自己,需要继续练习和做教程,但我似乎无法直接找到任何东西。

谢谢!

4

3 回答 3

74

在其他任何事情之前,我建议先看看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 资源的无状态接口。取消它们会给您留下两个访问点:

  1. 对于人类:backbone.js 层提供的丰富的客户端接口(有状态)
  2. 对于机器:rails层提供的面向资源的RESTful API(无状态)

请注意,人类不再有无状态(RESTful)接口。相比之下,在带有 API 的传统 Rails 应用程序中,我们有一些更接近于这个的东西:

  1. 人类的 HTML 资源(无状态)
  2. 机器的 JSON/XML 资源 (API)(无状态)

后两个用于访问资源的接口在本质上比前两个更接近以 rails 的respond_with为例,它利用相似性将各种 RESTful 响应程序包装在一个统一的方法中。

一起工作

我知道,这一切似乎都非常抽象而且无关紧要。为了使它更具体,请考虑以下问题,它回到您关于让 rails 和主干.js 一起工作的问题。在这个问题中,您希望:

  • 使用backbone.js 创建具有丰富客户端体验的Web 服务,并将rails 作为JSON 格式的后端服务资源。
  • 用于pushState为应用程序中的每个页面提供一个 URL(例如/posts/123),该 URL 可以直接访问(通过在浏览器栏中输入)。
  • 对于这些 URL 中的每一个,还为没有 javascript 的客户端提供 HTML 页面。

这些对于现代 Web 服务的需求并不罕见,但它们带来了复杂的挑战。长话短说,您现在必须创建两个“以人为本”的层:

  1. 有状态的客户端界面(backbone.js 模板和视图)
  2. 无状态 HTML 资源(Rails HTML 视图)

实际这样做的复杂性导致现在许多人放弃这两者中的后者,而只提供丰富的客户端界面。你决定做什么取决于你的目标和你想要实现的目标,但值得仔细考虑这个问题。

作为另一个可能的参考,我建议看看 O'Reilly 的RESTful Web Services。在一个关于 Rails 和 Backbone.js 的问题中推荐一本关于 REST 的书可能看起来很奇怪,但实际上我认为这是将这些非常不同的框架结合在一起的关键部分,更全面地理解它将帮助你利用两者的强项。

于 2012-08-12T13:35:30.400 回答
1

是的,您可以同时使用两者。Backbone 用于在客户端浏览器中存储和操作数据。它通常需要一个服务器与之交谈并从中获取数据。这就是 Rails 的用武之地。您可以拥有一个没有繁重客户端代码的 Web 应用程序。Backbone 用于构建感觉更像应用程序的网站——想想 Gmail 或 Pandora。

我建议先学习 Rails。一旦您可以根据需要加载静态页面并设置样式,那么了解 Backbone 的位置将更有意义

于 2012-08-12T00:10:07.033 回答
1

我使用 Rails 作为后端服务器来为一个相当大的网站提供服务,其中包括一些单页应用程序(内置主干)。

我会建议backbone-on-rails宝石。这个想法是您的 Rails 服务器将在您的一个视图中将主干应用程序作为脚本标记提供服务。您将主干应用程序本身保存在 railsapp/assets文件夹中。

Backbone 了解 rails 路由约定,您只需为其提供一个 json api 的路径,rails 几乎可以为您生成rails generate resource.

除了模型之间的同步之外,您的主干应用程序和 Rails 应用程序是相当独立的。Backbone 和 Rails 没有完全相同的 MVC 模型,但让它们合作很容易。

于 2012-08-12T00:14:05.097 回答