据说经历了 6 个月,4 个 beta, 两个 rc,上百个参与者以及上千个 Commit,Rails 5 终于正式发布了!
新 Logo!
Rails 里面全新的 WebSockets 框架以及解决方案,为了类似聊天、通知这类需要实时的功能而设计!Basecamp 3 以及在大量应用 Action Cable(Ruby China 的 通知系统 也用上了哦!)
再也不需要用 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
;attribute
定义一个新的类型,它会覆盖原有的字段;ApplicationRecord
,在 app/models 里面的一个新文件;ActiveRecord::Relation#in_batches
更低的内存消耗;Post.where(‘id = 1’).or(Post.where(‘id = 2’))
;throw(:abort)
的方式,而不是像以前返回 false。更多内容阅读官方发布公告:
http://weblog.rubyonrails.org/2016/6/30/Rails-5-0-final/
不要再等待,赶紧打开你的电脑,升级 Rails!
此外背后的 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 按钮
Action Pack 改动要点:
helpers
引入 Helper 了;fresh_when
, stale?
方法现在开始默认设置 weak ETag
;params.dig
类似 Ruby 的 dig
方法;ActionController::TestCase
没了,以后用 IntegrationTest 代替;redirect_to :back
ActionController::BadRequest
错误;root
声明,例如可以加条件判断域名来指向不同的 root;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 的默认行为了; Action Model & Active Record
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 场景里面有)
此外背后的 Rack 以及 2.0 了哦!不过我没找到准确的更新内容介绍
下次有这种好机会,也提醒一下我,我一直想为大项目做点贡献!
- 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_for
和div_for
这两个方法,据说是移动到record-tag-helper
这个 gem 里面去了,需要单独安装这个 gem。
一些疑问:
============= 看来我想错了,原来现在 actioncable 主要用的 redis pub/sub
#27 楼 @small_fish__ 我没明白你的担忧具体指的什么。
WebSockets 背后的原理我没研究过,以表现来看,连接是到一个一个机器就固定了,也是和机器无关的,有连接就能有通道接收消息,断掉以后由客户端再次发起新连接,这次可能会到其他机器。
而 Action Cable 背后涉及到数据的(例如队列)都放到 Redis 里面了。
我有另外个项目在用 Action Cable,部署是多机器的
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}
如果您的项目中有大表需要做分表,并且数据库是 PostgreSQL,可以用 https://github.com/fiksu/partitioned ,不过这个 gem 只支持 gem 'rails', '~> 4.1.13'。不支持 Rails5。所以是否用 Rails 5,生态环境也是要重点考虑的。