You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RailsAdmin同时配置hstore与自定义标签触发FrozenError求助

解决RailsAdmin中hstore字段与自定义标签共存的FrozenError问题

我之前碰到过一模一样的问题,这个FrozenError的根源在于:当你在模型的rails_admin块里动态添加hstore字段时,RailsAdmin内部会把字段配置数组冻结起来,之后在初始化器里尝试修改同一模型的配置(比如自定义标签),就会触发"无法修改冻结数组"的异常。

下面是两种经过验证的解决办法:

方法一:把hstore配置移到初始化器统一管理

把模型里的hstore字段配置逻辑迁移到RailsAdmin的初始化器文件中,和自定义标签配置放在一起,这样就能避免修改已冻结的数组:

# config/initializers/rails_admin.rb
config.model User do
  # 先动态添加hstore字段
  User.stored_attributes[:options].each do |field|
    configure field
  end

  # 再配置自定义标签
  list do
    configure :orders_count do
      label 'Has orders'
    end
  end
end

记得移除模型中rails_admin块里的hstore配置代码哦。

方法二:在模型中用fields方法批量添加字段

如果更习惯在模型里保留hstore配置,可以修改模型代码,用fields方法一次性添加所有hstore字段,这种方式不会触发数组冻结的问题:

# app/models/user.rb
store_accessor :list_of_hstore_keys
rails_admin do
  # 用fields批量导入hstore字段
  fields *User.stored_attributes[:options]
end

初始化器里的自定义标签配置可以保持原样不变。

补充说明

为什么这两种方法能解决问题?

  • 方法一将所有配置集中在初始化器中,RailsAdmin会在一个流程里完成所有字段配置,不会出现先冻结数组再修改的情况。
  • 方法二用fields方法一次性注入所有hstore字段,和逐个调用configure的内部逻辑不同,不会触发数组冻结的操作,因此后续初始化器的修改能正常执行。

内容的提问来源于stack exchange,提问作者Oleh Sobchuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:12:05