Rails Rails 6.0.0 beta1 发布

nyrf · January 19, 2019 · Last by mengqing replied at May 03, 2019 · 7028 hits
Topic has been selected as the excellent topic by the admin.

主要更新包括:

1、Action Mailbox 集成

2、Action Text 以 Trix editor 为基础的富文本编辑器

3、new multiple database support 多数据库支持

4、parallel testing support 并行测试

5、Webpacker 现在默认做为 js 的打包工具,不过还是用 Sprockets 进行图片和 css 的处理

6、其它一些比如:Action cable testing, Action Cable JavaScript 使用 es6 重写等

7、Rails 6.0 要求 Ruby 2.5.0+

更多详细的可以看CHANGELOG

其中有几个对我自己有帮助的更新:

1、Active Storage 如下代码@user.avatar = params[:avatar],现在只有在@user保存成功后才会保存图片。

2、添加了一个implicit_order_column, 在我们使用 Model.first 或者 Model.last 时,是以主键做为排序的,不过如果主键是 uuid 等,可能得不到我们想要的结果,有了这个可以加上如下代码

class Project < ActiveRecord::Base
  self.implicit_order_column = "created_at"
end

3、has_secure_password现在支持自定义名称,比如

class User < ActiveRecord::Base
  has_secure_password :recovery_password, validations: false
end

user = User.new()
user.recovery_password = "42password"
user.recovery_password_digest # => "$2a$04$iOfhwahFymCs5weB3BNH/uX..."
user.authenticate_recovery_password('42password') # => user

4、delegate添加了private选项

class User < ActiveRecord::Base
  has_one :profile
  delegate :date_of_birth, to: :profile, private: true

  def age
    Date.today.year - date_of_birth.year
  end
end

# User.new.age  # => 29
# User.new.date_of_birth
# => NoMethodError: private method `date_of_birth' called for #<User:0x00000008221340>

5、create_table添加了:if_not_exists选项

create_table :posts, if_not_exists: true do |t|
  t.string :title
end

6、添加了Relation#pick, 以前这么写

Post.where(category: "Rails 6").limit(1).pluck(:name).first

现在可以

Post.where(category: "Rails 6").pick(:name)

7、多数据库支持,我平时没怎么用到,看了下,主要有两个 api

(1) connects_to,在 model 中连接多数据库

class AnimalsModel < ApplicationRecord
  self.abstract_class = true

  connects_to database: { writing: :animals_primary, reading: :animals_replica }
end

class Dog < AnimalsModel
  # connected to both the animals_primary db for writing and the animals_replica for reading
end

(2) ActiveRecord::Base.connected_to方法,可以使用role来连接已经在 model 中定义的连接,比如

class Book < ApplicationRecord
end
ActiveRecord::Base.connected_to(role: :reading) do
  Dog.first # 在AnimalsModel中定义了`reading: animals_replica`,可查找记录
  Book.first # 没有定义reading,报错
end

也可以使用database连接在database.yml中定义过的数据库

ActiveRecord::Base.connected_to(database: :slow_replica) do
  SlowReplicaModel.first #如果在`database.yml`中定义了`slow_replica`数据库,那可以查找,否则报错
end

不过ActiveRecord::Base.connected_to可以接受 hash 或者 url configs,

User.connected_to(database: { writing: "postgres://foo" }) do
  User.create!(name: "Gannon")
end

config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
User.connected_to(database: { reading: config }) do
  User.count
end
jasl mark as excellent topic. 19 Jan 11:57

刚好有个项目要连多个数据库。

Use the ImageProcessing gem for Active Storage variants, and deprecate the MiniMagick backend. This means that variants are now automatically oriented if the original image was rotated. Also, in addition to the existing ImageMagick operations, variants can now use :resize_to_fit, :resize_to_fill, and other ImageProcessing macros. These are now recommended over raw :resize, as they also sharpen the thumbnail after resizing.

这个也很赞!

最近在用 Laravel,后起之秀

Reply to sharpx

php 累死。。

Reply to sharpx

都在模仿 rails,不过用户基数大,势头很猛,不过还是 ruby+rails 爽

Reply to sharpx

PHP 做这种有点东施效颦的感觉,不过 Laravel 能做到今天已经很厉害了。 然鹅我还是选择 Rails,选择 Rails 不仅仅是它本身,还有对 DHH 一套理念的执着追求(被 DHH 洗脑 ing

Go 有一个 Web 框架,简直像素级模仿 Rails,我猜测作者应该之前也是写 Rails 的: buffalo. 看了这个框架的文档,我是很服气的。

其实我看着 https://weblog.rubyonrails.org/2019/1/18/Rails-6-0-Action-Mailbox-Action-Text-Multiple-DBs-Parallel-Testing/ 真的非常担心。最重要的两样 Features; Parallel Testing and Multiple Database Support 基本上就只是 Github 两个员工 Eileen , Aaron 努力得出来的成果。Action Mailbox , Action Text 基本上是 BaseCamp.

这里 Rails 跟 Ruby 的问题一样,就是人太少。怎么不见 Kickstarter, ZenDesk, Shopify, AirBnB, Twitch, Bloomberg.......

Reply to killernova

buffalo 我用过,还是去年做个小项目时用的,作者就是以前做了个网站 MetaCasts 开始是教 ruby 的,后来他换成教 go 了。

Reply to ksec

其实小众些的语言都差不多,主要功能贡献都是那几个,去年也用过的 phoenix,基本就是 DockYard 和 plataformatec 的人

Reply to ksec

因为跨公司去搞这些是很麻烦的,rails 应该是有全职开发者的,如果不能进入内部讨论的圈子,你做个 pr 三个月才合/不合也是颇为正常的事

Reply to nyrf

用起来如何?和 beego 或者 iris 之类的相比怎么说?

Reply to killernova

相对 rails 的我来说,写起来有些麻烦,由于 go 语言的特性,要不停地if err != nil,不过打包一丢还是挺方便的,整体体验还可以吧,我也只是小东西用下

Laravel PHP 也开始玩优雅...

laravel 的生态已经很 NB,只是,框架做的再优雅也掩盖不了 PHP 语言本身的丑陋。

6.0 对 ActiveStorage 的更新也不错,解决了 5.2 的好几个问题

Reply to ksec

响应速度还是挺快的说实话,给 beta 1 提了俩 issues,很快解决了:

https://github.com/rails/webpacker/issues/1908#event-2096785670

https://github.com/rails/rails/issues/35026#event-2099088641

Reply to mizuhashi

因为跨公司去搞这些是很麻烦的,rails 应该是有全职开发者的,如果不能进入内部讨论的圈子,你做个 pr 三个月才合/不合也是颇为正常的事

這邊才 QQ,等了一年還不給 merge,卻老是讓其他更晚的小 PR 給 merge,害我一直要解 conflict。以後不會再貢獻了。

https://github.com/rails/rails/pull/32313

Reply to lulalala

哈哈哈是这样的,好事多磨,不过对于有专人维护的库我也觉得提 issue 就好了,沟通成本太高

Reply to lulalala

其实也不是太差吧,虽然说是一年,但其实整个 PR 非常之大,最后 Finalize 是最近一两个月的事,1 月 19 号 还变成了 6.0 Milestone. 我想正式 Merge 不远.... ( Shopify 最近也应该比较忙 )

@ksec 謝謝
不滿主要還是在我之後建立的其他相關 PR,維護者都是兩天內秒 merge,我就得花好多個週末去解 conflict(根本就是重新理解這堆 PR 然後重寫一遍)然後有九個月的時間,我 email/github/twitter 上怎樣嘗試聯繫維護者都是石沉大海(然後看他一次次秒 merge)。實在太不公平了。

Reply to lulalala

@lulalala 终于都 Merge 了 ! 👏 👏 👏 👏

而且原来现在 Shopify / Github / Basecamp 也是 running on master. [1] 因为这个原因我觉得 merge 难度提高了不少。 现在终于可以松一口气,一直很担忧你会放弃了。希望你能够因为你自己的 Patch / Features 已经在 Shopfiy / Github / Bsecamp 上面 Running 而感到自豪。不要气馁。

👍 👍 👍 👍

[1] https://weblog.rubyonrails.org/2019/4/24/Rails-6-0-rc1-released/

Reply to lulalala

厉害,虽然我已经改用 dry-validation 了,但是还是要给你个👍

You need to Sign in before reply, if you don't have an account, please Sign up first.