ActiveRecord::AssociationTypeMismatch错误:期望Tag实例却获字符串
问题解决方法
核心原因
你遇到的ActiveRecord::AssociationTypeMismatch错误,是因为**Post.new(post_params)时,post_params中包含了:tags参数**。Rails会自动尝试将传入的字符串数组(["tag1", "tag2"])赋值给@post.tags关联,但这个关联只能接受Tag实例,而非字符串,因此触发类型不匹配错误。
修复步骤
修正
post_params方法,确保不允许:tags作为参数传入:def post_params params.require(:post).permit(:title, :body) # 移除:tags参数 end你原本就在控制器中手动处理标签关联逻辑,不需要让Rails自动处理
tags参数。验证逻辑:
修正后,Post.new(post_params)只会初始化title和body属性,不会触碰tags关联。后续你通过tags.each do |tag| @post.tags << Tag.find_or_create_by(name: tag)手动添加Tag实例的逻辑就能正常执行。
额外排查点
如果你之前的代码能正常运行,大概率是近期修改post_params时不小心把:tags加入了允许列表,检查参数白名单即可。
内容的提问来源于stack exchange,提问作者Confused
相关产品推荐
相关产品推荐

