rails 和主干一起工作

IT技术 javascript ruby-on-rails ruby model-view-controller backbone.js
2021-03-07 15:01:39

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

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

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

如果是这样...

你什么时候使用backbone.js模型和rails模型?

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

谢谢!

3个回答

在做任何其他事情之前,我建议看一下 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 资源的无状态界面。去掉它们会给你留下两个接入点:

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

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

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

为了获得资源后两个接口是很多在本质上比前两者更接近对方。以 rails 的respond_with为例,它利用相似性将各种 RESTful 响应器包装在一个统一的方法中。

合作

这可能看起来都非常抽象,而且离题了,我知道。为了尝试使其更具体,请考虑以下问题,这又回到了有关让 rails 和backbone.js 协同工作的问题。在这个问题中,你想:

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

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

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

实际执行此操作的复杂性导致如今许多人放弃这两者中的后者而仅提供丰富的客户端界面。你决定做什么取决于你的目标和你想要达到的目标,但这个问题值得仔细考虑。

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

您不需要添加哈希。您所需要的只是一个(Rails)路由,它呈现应用程序的相同根视图,然后 Backbone(启用 pushState)会将路径识别为 Backbone 路由并呈现适当的(Backbone)视图。如果浏览器不支持 pushState,Backbone 会识别并重定向到带有哈希前缀的路径。
2021-04-21 15:01:39
哇这太棒了。稍微澄清一下:在协同工作部分,您概述的解决方案的想法是在主页上有一个主干应用程序,例如使用 AJAX 或其他方法访问 JSON 数据而不是视图,但也使可以通过输入 URL 有机访问的 HTML 视图?再次感谢您的详尽回答,我真的很感激!
2021-04-30 15:01:39
很开心你喜欢!是的,你说到了关键点,我没有尝试具体回答,因为那将是另一个讨论。这实际上取决于您正在构建的应用程序类型。例如,对于我现在正在做的一个应用程序,我们决定只为对我们资源的 GET 请求提供(无js)HTML 页面。如果用户想要创建或更新这些资源,他们必须通过丰富的界面(或可能直接访问 API)。这是一个设计选择。您也可以选择放弃无 JS 支持,但仍有资源的 URL,那么您就不需要 Rails 视图。
2021-05-02 15:01:39
很棒的答案。如果我可以+2,我会的。感谢您花时间整理出如此完整、周到的回复。
2021-05-14 15:01:39
不客气!请将链接传递给对此主题感兴趣的任何其他人。
2021-05-14 15:01:39

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

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

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

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

Backbone 理解 rails 路由约定,你只需要给它一个 json api 的路径,rails 几乎可以用rails generate resource.

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