Rails7+Filepond多文件上传触发PG唯一约束冲突求助
Rails 7中Active Storage搭配Filepond批量上传触发PG::UniqueViolation错误
问题现象
- 在Rails 7环境下,使用Active Storage结合Filepond提交2张及以上图片时,持续触发PG唯一约束冲突错误
- 该问题仅在使用Filepond、Uppy等第三方JS上传库批量上传时出现,原生Active Storage功能正常
- 已尝试删除并重建数据库,未解决主键相关问题
当前配置情况
- 基于Filepond演示仓库改造,已完成以下多文件上传配置:
- 表单字段添加
multiple: true - 控制器参数允许
images: [] - JS配置中设置
allowMultiple: true
- 表单字段添加
错误详情
提交时出现重复的signed_id(参数中前5个ID与后5个重复),触发如下错误:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_active_storage_attachments_uniqueness" DETAIL: Key (record_type, record_id, name, blob_id)=(Project, 5, images, 40) already exists.
提交的参数示例:
{"authenticity_token"=>"[FILTERED]", "project"=> {"name"=>"bab", "images"=> ["", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBMUT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--f8f1c9e5f89f31780bef2c8f8f0b149dd635573e", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBMZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--38e63fff54e2887d283e95dc71ac5384d9af173f", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBNQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--4c7a4cf2646b3cb1cf4a76466b75a6293ec7462f", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBMdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--f9b7602bd59038c74c7b6a741f1d13defd4bd647", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBNUT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0a922651723e7f16b4a4039b4532d27a8cd36a48", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBMUT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--f8f1c9e5f89f31780bef2c8f8f0b149dd635573e", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBMZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--38e63fff54e2887d283e95dc71ac5384d9af173f", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBMdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--f9b7602bd59038c74c7b6a741f1d13defd4bd647", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBNQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--4c7a4cf2646b3cb1cf4a76466b75a6293ec7462f", "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBNUT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0a922651723e7f16b4a4039b4532d27a8cd36a48"]}, "commit"=>"Create Project"}
相关JS代码
import { DirectUpload } from '@rails/activestorage' import * as FilePond from 'filepond' // Get the input element const input = document.querySelector('.filepond') const directUploadUrl = input.dataset.directUploadUrl // Initialize FilePond FilePond.create(input) // Set FilePond settings FilePond.setOptions({ allowMultiple: true, server: { process: (fieldName, file, metadata, load, error, progress, abort, transfer, options) => { const uploader = new DirectUpload(file, directUploadUrl, { directUploadWillStoreFileWithXHR: (request) => { request.upload.addEventListener( 'progress', event => progress(event.lengthComputable, event.loaded, event.total) ) } }) uploader.create((errorResponse, blob) => { if (errorResponse) { error(`Something went wrong: ${errorResponse}`) } else { const hiddenField = document.createElement('input') hiddenField.setAttribute('type', 'hidden') hiddenField.setAttribute('value', blob.signed_id) hiddenField.name = input.name document.querySelector('form').appendChild(hiddenField) load(blob.signed_id) } }) return { abort: () => abort() } }, fetch: { url: './filepond/fetch', method: 'POST' }, revert: { url: './filepond/remove' }, headers: { 'X-CSRF-Token': document.head.querySelector("[name='csrf-token']").content } } })
求助需求
寻求解决批量上传时重复signed_id导致唯一约束冲突的方案
内容的提问来源于stack exchange,提问作者Brendan
相关产品推荐
相关产品推荐

