2017年4月27日,星期四

Rails 5.1:喜欢 JavaScript、系统测试、加密密钥等

由 dhh 发布

为了庆祝本周在亚利桑那州凤凰城举行的第12届RailsConf,我们很自豪地宣布Rails 5.1已正式发布!自Rails 5.0以来,我们已提交了超过4100次提交,使一切变得更轻松、更简单,呃,更有趣?(这是RailsConf上的一个笑话)。

自第一个Beta版以来,亮点内容变化不大,但在此重申一下:

拥抱JavaScript

多年来,我们与JavaScript的关系一直跌宕起伏,甚至可以说是充满争议。但那些日子已经过去了。近年来,JavaScript取得了巨大的进步,特别是随着ES6的出现,以及Yarn和webpack等包管理和编译工具的问世。Rails正敞开怀抱拥抱这些解决方案,让过去的恩恩怨怨随风而去。

JavaScript和Ruby在语言设计方面有着深厚的哲学渊源,尽管在生态系统管理方面可能有所不同。让我们关注共同点,并通过一些关键的指导约定,帮助Rails程序员从JavaScript中提取最大价值。

Rails 5.1的改进主要集中在三个方面:

  1. 通过Yarn管理NPM的JavaScript依赖。可以将Yarn视为JavaScript的Bundler(甚至Yehuda Katz也参与其中!)。这使得依赖React或NPM上的任何其他库变得轻而易举。通过Yarn依赖的所有内容都将可在Asset Pipeline中引入,就像以前的Vendor依赖一样。只需使用binstub bin/yarn 添加依赖。

  2. 可选地使用webpack编译JavaScript。虽然JavaScript有无数种模块打包器/编译器,但webpack正迅速成为首选。我们通过新的Webpacker gem使Rails更容易使用webpack,您可以在新项目中使用--webpack(甚至--webpack=react--webpack=angular--webpack=vue以获得定制配置)自动配置它。这与Asset Pipeline完全兼容,您可以继续使用Asset Pipeline来处理图片、字体、声音等。您甚至可以将部分JavaScript放在Asset Pipeline中,部分通过webpack处理。所有这些都通过默认启用的Yarn进行管理。

  3. 移除jQuery作为默认依赖。以前,我们依赖jQuery来提供data-remote、data-confirm等功能,以及Rails UJS的其他部分。现在,这个依赖不再是必需的,因为我们使用原生JavaScript重写了rails-ujs。当然,您仍然可以使用jQuery,但不再必须使用它。

感谢Liceth Ovalles对Yarn集成的贡献,感谢Dangyi Liu对rails-ujs的贡献,以及感谢Guillermo Iguaran的协调!

系统测试

在我2014年RailsConf上的主题演讲中,我曾详细阐述过过度关注单元测试(和TDD)是如何让我们走偏的。虽然单元测试是完整测试解决方案的一部分,但它们并非最重要的部分。那些从控制器到模型和视图验证行为的集成测试应该扮演更重要的角色。Rails已经内置了很好的解决方案。

但是,如果系统依赖JavaScript,集成测试将无法帮助您测试整个系统。而如今大多数大型Web系统都在某种程度上依赖JavaScript。这时,由真实浏览器驱动的系统测试就派上用场了。

在Ruby中,一直都有Capybara这样的系统测试解决方案。只是将其正确配置到Rails中一直是个挑战。现在,我们已将其直接集成到框架中!它对Capybara进行了漂亮的封装,并针对Chrome进行了预配置,同时增强了Action Dispatch功能,可提供失败截图。您也不必再担心额外的数据库清理策略,因为内置的事务性测试现在会自动回滚系统测试的更改。

这些测试并非没有权衡。通过整个浏览器环境进行测试当然比只测试一个带有模拟数据库的模型要慢。但它也测试了更多内容。您最好熟悉系统测试,并将其纳入您的测试解决方案中。

感谢Eileen M. Uchitelle将其从Basecamp中提取出来!

加密的Secrets

如果您将生产环境的密码、API密钥和其他敏感信息明文提交到您的版本控制系统,那么您就做错了。这不安全,您应该立即停止!虽然这很容易给出建议,但如果没有一个清晰的替代方案,则帮助不大。

人们长期以来一直通过加载ENV来存储这些敏感信息,或者使用各种其他解决方案。ENV模型存在各种权衡和缺点,尤其是您仍然需要将这些敏感信息另外存储在别处。

Ara T. Howardsekrets gem的启发,我们在Rails 5.1中内置了加密的Secrets管理功能。您可以使用bin/rails secrets:setup设置新的加密Secrets文件。它会生成一个您需要存储在仓库外的master key,但允许您将实际的生产Secrets提交到版本控制中。然后,在生产环境中,可以通过注入的密钥文件或ENV中的RAILS_MASTER_KEY来解密它们。

感谢Kasper Timm Hansen为此付出的努力,以及Ara的灵感!

参数化邮件

Action Mailer模仿Action Controller。它通过Abstract Controller共享底层,但在共享Action之间的逻辑方面,它一直不如其控制器同类。

在Action Controller中,通常使用before_action和类似的callback来提取适用于多个Action的逻辑。这是可行的,因为params哈希在Action被调用之前可用。但在Action Mailer中,我们一直使用常规的方法签名和显式参数,因此这些参数在Action调用之前的filter中不可用。

通过Parameterized Mailers,我们现在为您提供了使用参数调用邮件器的选项,这些参数与控制器中的一样,在Action调用之前可用。这与默认的to/from/reply_to头结合,可以大大减少某些邮件Action的重复代码。

它完全向后兼容,您可以先转换那些最需要提取逻辑的邮件。

直接 & 解析路由

我们有一个优雅、简单的API来声明新的资源路由。但如果您想添加基于参数确定最终目的地的编程路由,那么您就需要自己动手,使用助手和其他繁琐的方法。

通过直接路由(directed routes),您现在可以声明具有Ruby全部功能的编程路由,根据传入的参数执行不同的操作。

通过解析路由(resolved routes),您可以将多态查找(polymorphic look-up)直接重写为兼容方法。例如,这允许您将link_to @comment转换为像message_path(@comment.parent, anchor: "comment_#{@comment.id}")这样的最终路由。

感谢Andrew White为此所做的所有工作

统一form_tag/form_for与form_with

我们一直有两个并行的表单创建结构。一种是基于记录的form_for,我们通过约定优于配置来提取细节;另一种是使用form_tag手动配置的。现在,我们通过form_with统一了这两个层级。一个单一的根树,您可以根据推断的记录或手动进行配置。它更漂亮、更简单。

同样感谢Kasper Timm Hansen的贡献!

其他所有内容

除了亮点内容外,我们在所有框架中还有数百项其他修复和改进。请仔细阅读CHANGELOGs,以便您了解所有新特性。

我们为您准备了发布说明,其中总结了主要的高层变更。

Rails 5.1的发布经理是Rafael França

根据我们的维护策略,Rails 5.1的发布意味着bug修复将仅适用于5.1.x,常规安全问题适用于5.1.x和5.0.x,而严重安全问题适用于5.1.x、5.0.x和4.2.x。这意味着4.x及以下版本将基本不受支持!

感谢社区中的所有人在测试Rails 5.1的Beta版和发布候选版过程中所做的勤奋工作!我们根据bug报告和在此过程中提出的担忧进行了600多次提交。谢谢!Gracias! Merci! TAK!