为自定义类设置yaml_column_permitted_classes的正确方法
解决Rails 6.1中配置YAML允许类时的常量初始化问题
针对你遇到的问题,有几种符合Rails规范的解决方式:
1. 使用类名字符串代替直接引用常量
在application.rb里直接用字符串指定类名,Rails会在需要时自动解析并加载对应的类,避免启动时的未初始化常量错误:
# config/application.rb config.active_record.yaml_column_permitted_classes = [ Symbol, String, "Foo::Bar" ]
2. 延迟到初始化完成后配置
利用after_initialize块,在所有应用代码加载完成后再设置允许类,此时Foo::Bar已经被正确加载:
# config/application.rb config.after_initialize do config.active_record.yaml_column_permitted_classes += [Symbol, String, Foo::Bar] # 若已有默认配置,仅追加自定义类也可: # config.active_record.yaml_column_permitted_classes << Foo::Bar end
3. 初始化器配置并非不符合预期
你提到的在初始化器中设置ActiveRecord::Base.yaml_column_permitted_classes的方式,其实是Rails官方认可的配置方式之一。初始化器的加载时机晚于application.rb,此时应用的自动加载机制已经完成了自定义类的加载,不会出现常量未定义或重定义的问题,完全可以正常使用。
另外,不要在application.rb顶部直接require自定义类——开发环境中Rails的自动加载机制会重复加载文件,这正是导致常量重定义警告的原因。
内容的提问来源于stack exchange,提问作者patrickdavey
相关产品推荐
相关产品推荐

