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

如何在Ruby on Rails的ActiveAdmin中存储字符串数组?

问题:ActiveAdmin更新数组序列化字段时触发SerializationTypeMismatch错误

我有一个Rails模型,其中tags字段为字符串数组类型(通过序列化存储),其余字段均为字符串类型,模型代码如下:

class JobPost < ApplicationRecord
    serialize :tags, Array
end

通过Rails控制台更新数据库时一切正常,但通过ActiveAdmin更新时出现以下错误:

ActiveRecord::SerializationTypeMismatch in Admin::JobPostsController#create
can't serialize tags: was supposed to be a Array, but was a String. -- "tag"

我的ActiveAdmin配置代码如下:

ActiveAdmin.register JobPost do
  permit_params :title, :location, :companyname, :tags, :applyurl
end

解决方法

方法一:在ActiveAdmin控制器中处理参数转换

修改ActiveAdmin配置,添加表单输入提示,并在保存前将提交的字符串转为数组:

ActiveAdmin.register JobPost do
  permit_params :title, :location, :companyname, :tags, :applyurl

  form do |f|
    f.inputs do
      f.input :title
      f.input :location
      f.input :companyname
      # 提示用户用逗号分隔标签
      f.input :tags, label: "标签(逗号分隔)", input_html: { placeholder: "例如:ruby, rails, 后端" }
      f.input :applyurl
    end
    f.actions
  end

  controller do
    # 新建时处理tags参数
    def create
      process_tags_params
      super
    end

    # 更新时处理tags参数
    def update
      process_tags_params
      super
    end

    private

    def process_tags_params
      if params[:job_post][:tags].is_a?(String)
        # 拆分字符串、去除空格、过滤空值
        params[:job_post][:tags] = params[:job_post][:tags].split(',').map(&:strip).reject(&:blank?)
      end
    end
  end
end

方法二:在模型层添加自动转换逻辑

在模型中添加回调,自动将字符串类型的tags转为数组,兼容所有提交场景(包括控制台和ActiveAdmin):

class JobPost < ApplicationRecord
    serialize :tags, Array

    before_save :normalize_tags

    private

    def normalize_tags
      # 如果tags是字符串,则转换为数组
      self.tags = tags.split(',').map(&:strip).reject(&:blank?) if tags.is_a?(String)
    end
end

内容的提问来源于stack exchange,提问作者Sumanth Jois

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:00:58