Rails 6使用Zeitwerk时如何正确扩展ApplicationRecord避免弃用警告
规范实现方案
方案1:直接在ApplicationRecord原生定义中引入(最推荐,适合普通应用场景)
绝大多数场景下你完全不需要用初始化器去扩展,直接把模块引入逻辑写在app/models/application_record.rb内部即可,完全符合Rails约定,不会触发任何弃用警告:
# app/models/application_record.rb class ApplicationRecord < ActiveRecord::Base self.abstract_class = true include FancyMethods end
方案2:使用ActiveSupport加载钩子(适合引擎/gem扩展、不能修改原生ApplicationRecord的场景)
如果确实需要在不改动应用内ApplicationRecord文件的前提下做扩展,用Rails官方提供的组件加载钩子替代to_prepare块,完全规避初始化阶段自动加载的问题:
# 放置在config/initializers/ 目录下的任意初始化文件中 ActiveSupport.on_load(:active_record) do # Rails 6 环境可以加这行确保ApplicationRecord已加载 require_dependency Rails.root.join('app/models/application_record') ApplicationRecord.include FancyMethods end
原警告触发原因
你之前收到弃用警告,是因为把重开ApplicationRecord类的逻辑直接放在了初始化器中:Rails加载初始化器的阶段属于初始化流程,此时自动加载FancyMethods这个可重载常量会导致后续代码重载时改动不生效,不符合Zeitwerk加载器的设计规则。
用上述两种方案都可以彻底解决问题,且完全符合Rails官方规范,没有代码坏味道。
内容的提问来源于stack exchange,提问作者Peter P.
相关产品推荐
相关产品推荐

