Rails Rails 5 的新特性 (转)

rocLv · 2015年06月29日 · 最后由 yunfei1982 回复于 2016年04月21日 · 7671 次阅读

Rails 5 即将在 2015 年秋季发布,新版本拥有很多令人激动的特性。如果你使用 Rails 开发商城,那你必须使你的应用准备好迎接新的 Rails 新特性。 别担心!我们会在新版本到来之前让你了解新特性,现在就让我们让你了解有哪些新特性,这将会大大提高你的开发能力。

主要改进

有很多新特性将从根本上改变我们使用 Rails 的方式。比如说 Action Cable 和改进的 Turbolinks 新特性,能够立马提高我们开发 Rails 应用的工作流程。让我们看一些这两个新特性的细节。

合并 Rails API

在过去的几年中,得益于 Backbone.JS 和 Angular.JS 类库,单页面应用程序(SPA)得到了发展。我在近期开发的几个单页面应用程序借助了 Rails 的威力。我曾经尝试涉猎 Sinatra 项目甚至纯粹的 Rack 项目,但是最终的结果都是写了大量 的 boilerplatee 项目。我的做法没有参照 Rails,而且需要处理很多安全缺陷。我不得不在 rails-api 的社区驱动上层和传统的 rails 上进行开发。 在 Rails 5 中,rails-api 被整合到核心包中,并且能够像简单 JSON API 那样子使用 Rails。结合个人经历,我认为这是一个伟大的改进。我不再用为我的 JavaScript 客户端建立后台 API 发愁了。

Ruby 2.2.1

Ruby 2.2 是 Ruby 社区的一个新版本。不仅仅带来了 Ruby 巨大的性能提升,还引入了大量的新功能。此外,symbols 的垃圾收集获取了广泛的好评。有这样一个传说,当这个声明发布的时候,龙族的 Valeria 在 Seventh 王国落下了玫瑰雨。OK!也许我扯得太远了,但是一般来说是这样的。

注意:在迁移你的 Rails 5 之前你需要确认你的应用可以在 Ruby 2.2.1 上工作。

由于这些增强功能,Ruby 2.2+ 对 Rails 5 来说是一个可靠的选择。Rails 5 将仅支持在 Ruby 2.2.1 以上的版本上工作。

传统的 web 应用一般整页加载,而导致响应比较慢。解决这个问题的一个办法是只加载最小的内容区域。Turbolinks 只从服务器重载某个区域而不是刷新整个页面。这个改进虽然一定程度上改进了性能,但是相对还是比较慢。Turbolinks 3 将解决这个问题。 Tubolinks 3 让你可以有选择性的更新部分区域(通过 partial),而大部分页面都不更新。这很像 SPA 的工作。你可以选择直接在 server 端完成所有这样的工作,是不是很棒?

这是一个很赞的特性,目前的趋势朝着单页应用发展。然而,乍一看,它好像需要你去手动管理。这意味着你必须在特定的点上记住程序需要重载的部分。对我来说,这增加了不少代码累赘,而且容易搞砸。就我个人而言,我更喜欢使用 React 类似的东西,它通过虚拟 DOM 处理这个很在行。

备注:React 的工作方式是:它维护了一个所发生操作的虚拟 DOM。然后,比较虚拟 DOM 和实际 DOM 的差异,然后只做需要的变更。它确保 DOM 只有在绝对必要才发生变化且是最小化的。

不得不说的是,对于那些不喜欢围着 JS 转的人,这提供了一个即时的性能提升。

Action Cable

现在需要项目使使用 Websockets 来推送实时更新到客户端。虽然大多数浏览器已经开始支持这一点,我们任然需要服务器上一个强大的客户端来,管理用户和适当的发送更新信号。这种功能在一些新的框架中已经出现,像 Phoenix for Erlang。Rails 社区需不得不需要求助于第三方解决方案来实现这个,像 Pushr. 注意:对于新手来说,Websockets 从浏览器开启双工连接是 W3C 的标准。服务器端可以在需要的时候和客户端通信 (比如推送更新) 并且同步更新客户端状态而不需要整个页面重新加载。举例来说,这就是 Gmail 如何在不重新加载真个页面的情况下加载新的邮件. 通常 Rails 都提供了所有需要建立应用的开箱即用的工具。这也是它为什么如此流行的原因,特别是在一些初创团队。对 Websocket 支持的缺乏社是区中主要的不满的主要原因之一。看起来 Rails 核心团队已经注意到这一点并且开始讨论 Action Cable。我们不得不等待一段时间看它是如何在现实生活中工作的,但它任然令人振奋。

一些新的细节

Rails 内置 Rake

对于许多 Rails 新手来说,困惑的原因来自于不得不想出什么时候是有 rake 什么时候使用 rails。现在你不再需要在 rake 和 ralis 命令的上下文直接切换。你可以使用 ralis 命令运行所有的 Rake 任务。比如说:

rake db:migrate

将会变成:

rails db:migrate

这表面上看起来不太相同,但是对于许多初学者来说会变得简单。Rails 5 也会添加 restart 命令来快速重启应用。

活动记录(Active Record)的改变

一个改变是大多数时候忽略了对 tobelongs_to 的更新。当你创建一个 Student 类是 belongs_to 的关联类,创建一个 student 没有相关联的类是可行的。这导致了大量数据的不一致。对 Rails 5 来说,它的父类已经变成强制性的了。如果你在这里尝试插入一个空的记录,活动记录(Active Record)将会抛出异常。 改变对控制器(Controller)的测试

如果你测试你的模板并将其渲染到你的控制器,那你就做错了。对你的模板做个简单的变更将会留给你一个不眠之夜,抓住那个罪魁祸首。这就是为什么在 Rails 5 中,assert_template 被废弃的原因。但是,在目前你还会继续使用 assert_select 去检查特定的 DOM 元素。 如果你已经在一个控制方法内测试了实例变量,你就应该记得 assigns 也应该消失了。

如果你正在写控制器的测试用例,需要关注 cookies 的新命令,HTTP 返回值和 DB 调用。如果有得话,等等,这听起来像一个集合测试。好吧,你知道我想表达什么了。。。在将来的集成测试中会去掉控制器测试。

注意:点击链接 Rails Dom testing了解更多详细内容和最佳实践

总结

在 web 开发中 javascript 扮演着统治地位的今天,web 框架仅仅是在降低更少的 api 服务。Rails 核心团队意识到这点并且在朝向正确的方向。欢迎在评论中加入我们的讨论行列。

我把我心里的感觉说出来:我觉得 Rails 这一次大版本更新是最没有存在感的一次。

前两次升级至少我都觉得有点激动..

Ruby 2.2.1 有缺陷,依赖已经升到 Ruby 2.2.2 了 https://github.com/rails/rails/pull/19753

毕竟前端“兴起“了,Rails 其实也没多少要变化的东西。

#2 楼 @hooopo 为啥?期待 Rails 5 有其他新的功能?

#2 楼 @hooopo 要是有 活动模特 就完美了

转的出处何在?

活动控制器,活动包,活动视图和活动职位都没变化么?我是来灌水的……

#8 楼 @zoker 来源于开源中国

什么时候能把 rails 的性能提升上去,感觉 ruby on rails 总是比 java/。net 慢一些

楼主这是原创的文章,还是翻译的文章?怎么不贴原链接呢?

越往后翻译越差。。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号