javascript - rails 和 Backbone 一起工作

标签 javascript ruby-on-rails ruby model-view-controller backbone.js

我只是开始研究MVC结构,首先我研究了backbone.js的工作方式,现在我刚刚完成了Code School的rails for zombies。我知道我对这方面的研究还不够深入,但是我首先要提出一个问题。

可以一起使用这些库吗?

我已经学会了如何同时创建modelsviews等,但是在创建实际应用程序时,您同时使用了主干和Rails吗?

如果是这样...

何时使用backbone.js模型和rails模型?

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

谢谢!

最佳答案

在开始之前,我建议您先阅读一下Thoughtbot的Backbone.js on Rails书,尽管它的目标读者是中级到高级读者,但这是一个很好的起点。我买了已经与rails一起使用过的书,但作为 Backbone .js的初学者,它为我提供了很好的服务。

除此之外,结合这些框架还存在一些基本问题,这些问题超出了本书和其他书籍所涵盖的细节。以下是我建议您考虑的一些事情,这些经验是根据我将RoR和ribs.js配对的经验。这是一个很长的答案,与您的问题的具体内容有些出入,但我希望它可以从“全局”的角度帮助您理解所面临的问题。

Rails:Web框架与API

在Rails应用程序上使用ribs.js时,面对的第一件事是如何处理 View ,但这实际上只是一个更深层次问题的表面。问题涉及创建RESTful Web服务的含义的核心。

通过根据标准HTTP操作在统一URI(在routes.rb文件中定义)访问的一组资源的结构来构造路由,即开即用地设置Rails来鼓励其用户创建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请求发送到正确的URI来创建新的POST,例如/posts。当然,有一些警告:我可能需要登录(有一个 session cookie标识我),但是本质上,Rails在发送该请求之前实际上并不关心我在做什么。我可以通过更新另一篇文章或通过向我可用的其他资源发送有效操作来跟进。

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

    Backbone.js:新的有状态层

    Backbone 也基于RESTful资源。每当您创建,更新或销毁bone.js模型时,您都可以通过发送到URI的标准HTTP操作来进行操作,这些URI采用上述类型的RESTful体系结构。这使其非常适合与RoR之类的RESTful服务集成。

    但这里需要强调一个微妙的要点:骨架.js与Rails 作为API 无缝集成。这就是说,如果您剥离HTML View 并仅使用Rails来提供RESTful资源,与数据库集成,执行 session 管理等,那么它就会与ribs.js为客户端提供的结构很好地集成在一起。代码。许多人认为there's nothing wrong with using rails this way,我认为从许多方面来说都是正确的。

    但是,复杂性是由与我们刚刚扔掉的Rails的另一部分( View 及其代表)有关的问题引起的。

    有状态的人,无状态的机器

    实际上,这比最初看起来更重要。 HTML View 表示人类用于访问服务提供的RESTful资源的无状态接口(interface)。删除它们将为您提供两个访问点:
  • 对于人类:elegate.js层提供的丰富的客户端接口(interface)(有状态)
  • 对于机器:Rails层(无状态)提供的面向资源的RESTful API

  • 请注意,人类不再有无状态(RESTful)接口(interface)。相比之下,在具有API的传统Rails应用中,我们可以做到以下几点:
  • 人类的HTML资源(无状态)
  • 机器(无状态)的JSON/XML资源(API)

  • 后两个用于访问资源的接口(interface)在本质上比前两个彼此更接近。试想一下例如rails的respond_with,它利用相似性将各种RESTful响应器包装到统一方法中。

    合作

    这似乎都非常抽象,我知道这很重要。为了使它更具体,请考虑以下问题,该问题回到了有关使Rails和elenet.js协同工作的问题。在此问题中,您想要:
  • 使用lobb.js创建具有丰富客户端体验的Web服务,其中rails作为后端以JSON格式提供资源。
  • 使用 pushState 为应用程序中的每个页面提供一个URL(例如/posts/123),可以直接访问该URL(通过将其输入到浏览器栏中)。
  • 对于每个URL,还为没有javascript的客户端提供HTML页面。

  • 这些并不是现代Web服务的不寻常要求,但它们带来了复杂的挑战。简而言之,您现在必须创建两个“以人为本”的层:
  • 状态客户端接口(interface)(backbone.js模板和 View )
  • 无状态HTML资源(Rails HTML View )

  • 实际执行此操作的复杂性导致当今许多人放弃这两者中的后者,而只是提供了丰富的客户端接口(interface)。您决定做什么取决于您的目标和想要实现的目标,但是值得仔细考虑这个问题。

    作为这样做的另一个可能引用,我建议您看看O'Reilly的RESTful Web Services。在有关Rails和Backbone.js的问题中推荐一本关于REST的书似乎很奇怪,但是实际上我认为这是将这些非常不同的框架结合在一起的关键部分,并且更充分地理解它可以帮助您利用两者的优势。

    关于javascript - rails 和 Backbone 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11918586/

    相关文章:

    ruby - 使用ruby mail gem获取电子邮件正文而不获取附件

    ruby - Ruby 中的 UTF-8 错误

    javascript - 在 Modal asp.net mvc 中使用 ajax 添加数据

    ruby-on-rails - PG::ForeignKeyViolation: 错误:在表上插入或更新违反了外键约束

    javascript - 在Rails中生成VAPID公钥并将其传递给Javascript

    ruby-on-rails - Ruby 救援和最佳实践语法

    ruby - 安装 rmagick 时出错

    javascript - 如何将json从angularjs传递到d3?

    javascript - 是否可以停止从打印预览中复制文本?

    javascript - css:缩小时保持浏览器居中