铁轨和骨干一起工作

Tro*_*ino 35 javascript ruby model-view-controller ruby-on-rails backbone.js

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

你能一起使用这些库吗?

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

如果是这样...

你什么时候使用backbone.js模型而不是rails模型?

也许我只是领先于自己,需要继续练习和做教程,但我似乎无法直接找到任何东西.

谢谢!

Chr*_*erg 74

在其他任何事情之前,我建议看一下在Rails书上的thinkbot的Backbone.js,这是一个很好的起点,虽然针对的是中级到高级的观众.我买了这本书已经使用过rails但作为一个完整的主干.初学者并且它对我很有帮助.

除此之外,结合这些框架存在一些基本问题,这些问题超出了本书和其他书籍所涵盖的细节.以下是我建议您考虑的一些事情,根据我自己的经验配对RoR和backbone.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通过向有POST正确的URI 发送带有有效表单数据的请求来创建一个新的,比如说/posts.当然有一些警告:我可能需要登录(有一个会话cookie识别我),但实质上Rails并不真正关心我在发送请求之前做了什么.我可以通过更新其他帖子,或通过向我提供的任何其他资源发送有效的操作来跟进.

如何设计Rails的这一方面使得将(Javascript-light)Rails Web应用程序转换为API相对容易:资源将类似或相同,Web框架返回HTML页面,而API(通常)返回数据JSON或XML格式.

Backbone.js:一个新的有状态层

Backbone也基于RESTful资源.无论何时创建,更新或销毁backbone.js模型,都可以通过发送到URI的标准HTTP操作来实现,这些URI采用上述类型的RESTful架构.这使其成为与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应用程序中,我们更接近于此:

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

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

一起工作

我知道,这可能看起来都非常抽象,而且除此之外.为了使其更具体,请考虑以下问题,这可以回到关于让rails和backbone.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服务.在关于Rails和Backbone.js的问题上推荐一本关于REST的书可能看起来很奇怪,但实际上我认为这是将这些非常不同的框架组合在一起的关键部分,并且更全面地理解它将帮助您利用两者的优势.

  • 很开心你喜欢!是的,你点击了关键点,我没有尝试回答具体细节,因为这将是另一个讨论.这真的取决于你正在构建什么样的应用程序.例如,对于我现在正在做的应用程序,我们决定只为我们的资源提供GET请求的(无js)HTML页面.如果用户想要创建或更新这些资源,他们必须通过丰富的界面(或可能直接访问API).这是一个设计选择.您也可以选择删除no-JS支持,但仍然拥有资源的URL,那么您不需要rails视图. (2认同)
  • 很棒的答案.如果我能+2我愿意.感谢您花时间整理这样一个完整,深思熟虑的回应. (2认同)