Rails手动实现find_or_create标签功能时新创建标签id找不到报错问题
报错原因
- 未过滤参数中的空值:提交的
tag_ids参数包含空字符串"",用空字符串查询标签返回空ID数组,最终被Rails转为整数0,系统查找ID为0的标签失败抛出异常。 - 生成的标签ID数组格式错误:代码中每次调用
Tag.where(:name => tagName).ids返回的是数组,直接push到tagIds后形成二维嵌套数组,不符合ActiveRecord关联赋值要求的一维ID数组格式。 - 标签创建逻辑执行成功但关联逻辑中断:
Tag.create!已经完成新标签的创建,后续update动作因为ID错误抛出异常,所以刷新页面后可以看到新标签已经存在,再次提交时新标签已有合法ID不会报错。
修复方案
直接简化标签处理逻辑,过滤空值+生成合法的一维ID数组即可,修改后的代码如下:
def update respond_to do |format| # 过滤空标签名,查找或创建标签后直接生成一维ID数组 tag_ids = params[:contact][:tag_ids].reject(&:empty?).map do |tag_name| Tag.find_or_create_by(name: tag_name).id end # merge覆盖tag_ids参数后更新联系人 if @contact.update(contact_params.merge(tag_ids: tag_ids)) format.html { redirect_to @contact, notice: 'Contact was successfully updated.' } format.json { render :show, status: :ok, location: @contact } else format.html { render :edit } format.json { render json: @contact.errors, status: :unprocessable_entity } end end end
内容的提问来源于stack exchange,提问作者user2799827
相关产品推荐
相关产品推荐

