Rails Rails 6.0.0 beta1 发布

nyrf · 2019年01月19日 · 最后由 lulalala 回复于 2019年02月26日 · 4285 次阅读
本帖已被设为精华帖!

主要更新包括:

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
共收到 22 条回复
jasl 将本帖设为了精华贴 01月19日 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, 后起之秀

sharpx 回复

php累死。。

sharpx 回复

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

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.......

killernova 回复

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

ksec 回复

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

ksec 回复

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

nyrf 回复

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

killernova 回复

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

Laravel PHP也开始玩优雅...

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

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

ksec 回复

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

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

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

mizuhashi 回复

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

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

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

lulalala 回复

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

lulalala 回复

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

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

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