Rails中如何传递数组数据到控制器存入Pg数据库实现批量新增记录
问题原因
你遇到的报错是两个问题共同导致的:
- 循环内变量调用错误:你已经在遍历
params[:section]数组,每次迭代拿到的单条section数据是block里的data变量,但你给Section.new传的还是整个params[:section]数组,Model初始化只接受Hash类型参数,传数组直接触发ArgumentError。 - 没有处理Rails强参数:你打印的参数里所有section数据都标记了
permitted: false,Rails默认禁止直接用未许可的参数给Model赋值,必须先声明允许传入的字段。
修复步骤
第一步:修改Sections控制器代码
# /app/controllers/sections_controller.rb def create # 用事务包裹,保证多条记录要么全部创建成功,要么全部回滚 Section.transaction do @sections = section_params.map do |data| Section.create!(data) end end # 所有记录创建成功后统一返回响应 respond_to do |format| format.html { redirect_to layout_path, notice: "Sections Created Successfully" } format.json { render json: @sections, status: :created } end rescue ActiveRecord::RecordInvalid => e # 捕获创建失败的异常,返回错误信息 respond_to do |format| format.json { render json: {error: e.message}, status: :unprocessable_entity } end end private # 声明数组格式的强参数许可 def section_params params.permit(section: [:sectiontitle, :description, :height, :width, :layout_id, position: [:top, :left]])[:section] end
第二步:确认数据库字段适配
你传入的position是嵌套Hash,如果要存储这个字段,需要把sections表的position字段设置为json/jsonb类型,否则会报错。如果不想用json字段,可以把position拆成position_top和position_left两个整数字段存储,对应修改JS传参和强参数许可即可。
额外优化点
你原来的逻辑里每次循环都执行respond_to,会导致重复返回响应引发异常,修改后的代码统一在所有记录处理完成后返回响应,更符合规范。另外用事务包裹批量创建操作,避免出现部分创建成功部分失败的脏数据问题。
内容的提问来源于stack exchange,提问作者mukesh mahara
相关产品推荐
相关产品推荐

