如何在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 serializetags: 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
相关产品推荐
相关产品推荐

