1.准备工作
在开始升级过程之前,我们有一些建议的准备工作。
- 升级的时候,最好一个版本一个版本升级,比如6.0到6.1再到7.0,不要一次从6.0到7.0
- 至少80%的测试覆盖率,测试真的很重要,能确保升级快速完成。
- 本地新开分支升级,测试全部跑过后,再合到staging环境让测试人员过一遍。
- 可以通过使用RailsBump检查你的Gemfile.lock是否有不兼容之处。
- 根据gemfile.lock把gemfile中的gem都固定原来版本,只升级rails,后续有精力再升级gem
2.Rails指南
查阅官方的Rails指南,并遵循你的应用程序所需的任何步骤,这一点很重要。
3. 升级
使用rails app:update
进行升级
4. webpack
- 6.0里是
bin/webpack
bin/webpack-dev-server
命令 - 6.1里使用
rails webpacker:install
命令会生成bin/webpacker
bin/webpacker-dev-server
命令,都保留即可 - 使用
rails webpacker:install
命令还会更新package.json
yarn.lock
文件,建议升级rails时不要更新,等升级完稳定后可以考虑升级
5.zeitwerk
- Zeitwerk:如果你的应用程序仍然在经典模式下运行,你需要切换到zeitwerk模式。也没有设置自动加载模式的配置点,
config.autoloader=
已经被删除。如果你把它设置为:zeitwerk
,只要把它删除即可。查看我们写的关于Zeitwerk升级的文章。 - 使用
Rails.application.config.autoloader
查看现在的模式 - 使用
rails zeitwerk:check
检查是否需要添加appliaction.rb中的config.eager_load_paths
,如果打印的不是All is good!
,则根据提示添加:
ruby
# config/application.rb
config.eager_load_paths << Rails.root.join('app', 'models', 'prod_readonly')
config.eager_load_paths << Rails.root.join('lib')
6.valid
record.errors[attribute] << message
改为record.errors.add(attribute, :invalid, message)
ruby
# record.errors[attribute] << (options[:message] || '手机号格式错误')
record.errors.add(attribute, :invalid, message: options[:message] || '手机号格式错误')
# record.errors[:owner] << '无法对自己的货品进行竞拍'
record.errors.add(:owner, :invalid, message: '无法对自己的货品进行竞拍')
# record.errors[:base] << '无法对自己的回流单创建订单'
record.errors.add(:base, :invalid, message: '无法对自己的回流单创建订单')
7. 提示BigDecimal等错误或警告
ruby
# config/application.rb
config.active_record.yaml_column_permitted_classes = [
Symbol, Date, Time, BigDecimal,
ActiveSupport::TimeWithZone, ActiveSupport::TimeZone
]
6. 其他
-
Spring。如果你的应用程序使用Spring,它需要升级到至少3.0.0版本,否则你会得到
undefined method 'mechanism=' for ActiveSupport::Dependencies:Module
-
Sprockets现在是一个可选的依赖项。Rails不再依赖sprockets-rails了。如果你的应用程序仍然需要使用Sprockets,你需要明确地添加该依赖关系。如果你想把你的javaScript代码从sprockets迁移到Webpacker,可以看看这个博文。