Rails Rails 5 正式发布了 - Action Cable, API mode 以及其他新特性介绍

huacnlee · 2016年07月01日 · 最后由 pathbox 回复于 2016年07月24日 · 11950 次阅读
本帖已被管理员设置为精华贴

据说经历了 6 个月,4 个 beta, 两个 rc,上百个参与者以及上千个 Commit,Rails 5 终于正式发布了!

新 Logo!

Rails 5.0 两个最重点的功能:

Action Cable

Rails 里面全新的 WebSockets 框架以及解决方案,为了类似聊天、通知这类需要实时的功能而设计!Basecamp 3 以及在大量应用 Action Cable(Ruby China 的 通知系统 也用上了哦!)

API mode

再也不需要用 Grape 来写 API 了!轻量级的 Controller,为富客户端而设计!

你甚至可以直接 rails new backend --api 创建 API only 的 Rails Application!当然依然还有许多有待完善的地方,这是一个新的起点。默认 API mode 只是尝试调用 Model 的 #to_json 方法来输出结果。但你可以选择用 Jbuilder, Active Model Serializers, 或者尝试新出的 JSONAPI::Resources 等来实现一些高级特性。

其他亮点

  • 命令行里,以后 rails 一个命令包涵了 rake, rails 里面的所有内容,所以现在 bin/rails db:migrate 代替了 bin/rake db:migrate
  • New Attributes API - 在某些时候如果你需要的话,你可以在 Model 里面定义用 attribute 定义一个新的类型,它会覆盖原有的字段;
  • 现在跑测试的时候如果有错误会直接输出,无需等待跑完整个用例;
  • Model 现在开始继承于 ApplicationRecord ,在 app/models 里面的一个新文件;
  • ActiveRecord::Relation#in_batches 更低的内存消耗;
  • Active Record 新的 or 查询方式:Post.where(‘id = 1’).or(Post.where(‘id = 2’))
  • Active Record callbacks 要中断执行,现在需要用 throw(:abort) 的方式,而不是像以前返回 false。
  • 同时也带来了 Turbolinks 5

更多内容阅读官方发布公告:

http://weblog.rubyonrails.org/2016/6/30/Rails-5-0-final/


不要再等待,赶紧打开你的电脑,升级 Rails! 🎉 🎊

huacnlee [该话题已被删除] 提及了此话题。 07月01日 10:02

此外背后的 Rack 以及 2.0 了哦!不过我没找到准确的更新内容介绍 😼

由于 Sidekiq 的管理界面用了 Sinatra,而 Sinatra 这货节奏比较慢(Rack 2.0 beta 发布到现在这么久了,Sinatra 依赖改 rack 2.0 的版本还没发布),依然在用 rack 1.x 所以,这里会有问题。

https://github.com/sinatra/sinatra/pull/1131

WTB: one "merge" button click. Willing to spend many, many OSS dollars, i.e. goodwill and high fives. - by Sidekiq 的作者 mperham

大家都焦急的等待着 Sinatra 的项目负责人点击 Merge 按钮 😖 😣 🙀

Active Record callbacks 要中段,现在需要用 throw(:abort) 的方式,而不是像以前返回 fals

学习实践,大步前进 👍

martin91 [该话题已被删除] 提及了此话题。 07月01日 10:49

Action Pack 改动要点:

  • Controller 里面可以用 helpers 引入 Helper 了;
  • ETag 方面 fresh_when, stale? 方法现在开始默认设置 weak ETag;
  • params.dig 类似 Ruby 的 dig 方法;
  • ActionController::TestCase 没了,以后用 IntegrationTest 代替;
  • Add "image/svg+xml" as a default mime type (与时俱进);
  • redirect_back 代替 redirect_to :back
  • 遇到错误的 UTF-8 querystring 值,现在会抛 ActionController::BadRequest 错误;
  • Routes 里面可以写多个 root 声明,例如可以加条件判断域名来指向不同的 root;

😎 😎 😎 可以试一下 api mode.

遇到错误的 UTF-8 querystring 值,现在会抛 ActionController::BadRequest 错误

这个好!

Action View 要点:

  • render partial: 'notifications/notification', collection: ..., cached: true 这类动作的 cache 现在支持 multiple fetch (批量获取缓存),减少连接次数;
  • I18n.translate 只有在开启了 config.action_view.debug_missing_translation 配置的时候才会输出 missing translation keys 错误信息到 HTML,再也不用烦恼了;
  • disable_with 现在成为 Submit Button 的默认行为了;
11 楼 已删除

改进了不少

Action Model & Active Record

  • Remove ActiveModel::Serializers::Xml from core.
  • ActiveModel::AttributeAssignment ```rb class Cat include ActiveModel::AttributeAssignment attr_accessor :name, :status end

cat = Cat.new cat.assign_attributes(name: "Gorby", status: "yawning") cat.name # => 'Gorby' cat.status # => 'yawning' cat.assign_attributes(status: "sleeping") cat.name # => 'Gorby' cat.status # => 'sleeping'

- 字段值过大的时候抛 `ActiveRecord::ValueTooLong` ,而不想以前那样的奇怪错误(GitLab 场景里面有)

感觉 or 比起 sequel 的使用方式更容易理解

#2 楼 @huacnlee 😆 早上更新 rails 5 的时候发现的,作者已经合入了,还合了我的 PR

#14 楼 @geniousli where-or在 Rails 4.2.3+ 上也是可以提前用的。

#2 楼 @huacnlee

此外背后的 Rack 以及 2.0 了哦!不过我没找到准确的更新内容介绍

https://github.com/rack/rack/compare/1.6.4...2.0.1

#15 楼 @lyfi2003

下次有这种好机会,也提醒一下我,我一直想为大项目做点贡献!😀

-  s.add_dependency 'rack', '= 2.0.0.rc1'        +  s.add_dependency 'rack', '~> 2.0'

从 4.2.6 升级到 5.0 正式版了,Ruby 版本也升到了 2.3.1。目前只碰到一个 gem 有问题:remotipart,会导致这个错误: No such middleware to insert after: ActionDispatch::ParamsParser (RuntimeError)

临时改用了其它的版本就好了。希望原作者尽快为 5.0 做好升级。 gem 'remotipart', github: 'mshibuya/remotipart'

另外,rails 5.0 里去掉了content_tag_fordiv_for这两个方法,据说是移动到record-tag-helper这个 gem 里面去了,需要单独安装这个 gem。

令人兴奋,开始更新项目。

update: 我用 rails app:update 开始升级,完成后项目路由都没了...

一些疑问:

  1. Action Cable 性能如何?有方便做 benchmark,连接消耗的内存情况大概是?
  2. 目前 RubyChina 用的应该不是 RemoteCollection, 那如果存在 server scale 的情况,这个架构应该会调整,不知道方便不?
  3. 目前 pub 消息应该和 server 共用的 puma 线程数,当连接的 collections 较多时,会不会带来其他用户页面访问性能问题?

============= 看来我想错了,原来现在 actioncable 主要用的 redis pub/sub

https://www.nateberkopec.com/2015/09/30/action-cable.html

happybai [该话题已被删除] 提及了此话题。 07月06日 11:45

#22 楼 @small_fish__

  1. 目前平均 ActionCable 的连接数大概在 1700 个左右,内存耗费几乎可以忽略;
  2. RemoteCollection ? 什么意思?
  3. 目前 Ruby China 线上部署的方式是 Action Cable 和 Rails Application 用同一个 App Server 进程里面,跑了两周了,没有发现问题。我看过 Action Cable 里面的介绍,是可以这么做的。

#24 楼 @huacnlee

  1. 这个是单机数量么?不知道有没有好的方式做集群。 2: https://github.com/rails/rails/blob/master/actioncable/lib/action_cable/remote_connections.rb 3: 默认 ActionCable 配置的 worker 数量是 4,是否可以这么理解,假如 puma 一个进程起 16 线程,最多分了 4 个给 ActionCable 呢,及时 cable 连接数再多,也不回全部占用接请求的 worker?

#25 楼 @small_fish__

单机的,集群和 Rails 的部署一样啊,没什么复杂的;

第三点的原理我还没搞明白,但是看起来是和连接数无关的,有可能有个保持机制,有需要的时候才占有连接;

#26 楼 @huacnlee 应该与 rails 简单的平行扩展不一样,比如消息发生在一台机器,却要通知多台机器上创建的连接,这个和访问哪台机器,哪台机器响应还是有点不一样啊

#27 楼 @small_fish__ 我没明白你的担忧具体指的什么。

WebSockets 背后的原理我没研究过,以表现来看,连接是到一个一个机器就固定了,也是和机器无关的,有连接就能有通道接收消息,断掉以后由客户端再次发起新连接,这次可能会到其他机器。

而 Action Cable 背后涉及到数据的(例如队列)都放到 Redis 里面了。

我有另外个项目在用 Action Cable,部署是多机器的

#28 楼 @huacnlee 谢谢, 其实我没有明白的是 cable 的通知逻辑,怎么把消息 push 给所有连接的客户端(客户端连接到不同机器)

#29 楼 @small_fish__ 消息放到 redis 的队列里

#29 楼 @small_fish__ websockets 的实现吧

#17 楼 @ericguo 谢了,我学习 学习
您是作者呀

Rails5 的 Enumerable 增加了两个新成员#pluck, #without。 现在除了 AR 以外,hash 也能有#pluck 方法了。 这两个方法以后应该会常用到😁

# Enumerable#pluck
[{ name: "David" }, { name: "Rafael" }, { name: "Aaron" }].pluck(:name)
  => ["David", "Rafael", "Aaron"]

[{ id: 1, name: "David" }, { id: 2, name: "Rafael" }].pluck(:id, :name)
  => [[1, "David"], [2, "Rafael"]]

# Enumerable#without
["David", "Rafael", "Aaron", "Todd"].without "Aaron", "Todd"
  => ["David", "Rafael"]

{foo: 1, bar: 2, baz: 3}.without :bar
  => {foo: 1, baz: 3}

simple_form 目前不兼容 rails5, 不过根据已 fork 的一些 commit 自己打补丁。

or 的写法一直用 arel

如果您的项目中有大表需要做分表,并且数据库是 PostgreSQL,可以用 https://github.com/fiksu/partitioned ,不过这个 gem 只支持 gem 'rails', '~> 4.1.13'。不支持 Rails5。所以是否用 Rails 5,生态环境也是要重点考虑的。

#41 楼 @gazeldx Pg 不了解 MySQL 不用 gem 也能分

#42 楼 @pathbox 不用 gem 肯定可以,用 gem 的目的在于省事。

#43 楼 @gazeldx get it。所以,升级 Rails 5 不是阻碍的重点了。当然,一千个人心中有一千个哈姆雷特,不同的项目有不同的生态环境需求。

huacnlee 关于 Rails 4 和 Rails 5 差别大吗? 提及了此话题。 12月21日 17:29
huacnlee 将本帖设为了精华贴。 12月21日 17:29
huacnlee 关闭了讨论。 12月21日 17:29
需要 登录 后方可回复, 如果你还没有账号请 注册新账号