You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails多文件上传异常:仅获取单个文件而非全部

问题原因及解决方案

核心问题

  1. 表单字段名称缺少数组标识:多文件上传时,file_field_tag的名称必须以[]结尾,Rails才会将多个上传文件解析为数组。你当前用的'files'会让Rails仅解析最后一个上传文件为单个ActionDispatch::Http::UploadedFile对象,而非数组,调用each自然会报错。
  2. 控制器参数获取错误:你在page_action里直接使用未定义的files变量,正确的做法是从params中获取上传文件。

修复步骤

1. 修改表单模板(app/views/activeadmin/dashboard/_import_cves.html.erb)

将file_field_tag的名称改为'files[]',确保Rails把多文件解析成数组:

<%= form_tag admin_dashboard_import_cves_path, method: :post, multipart: true do %>
  <%= file_field_tag 'files[]', multiple: true %>
  <%= submit_tag 'Import CVEs' %>
<% end %>

2. 修改控制器逻辑(app/admin/dashboard.rb)

修正参数获取方式,同时增加安全判断避免无文件上传时的报错:

ActiveAdmin.register_page "Dashboard" do
  menu priority: 1, label: proc { I18n.t("active_admin.dashboard") }

  page_action :import_cves, method: :post do
    # 用&.避免无文件时调用each报错
    params[:files]&.each do |f|
      logger.debug "上传文件:#{f.original_filename},类型:#{f.content_type}"
    end
    redirect_to admin_dashboard_path, notice: "文件上传处理完成"
  end

  content title: proc { I18n.t("active_admin.dashboard") } do
    columns do
      column do
        panel 'Upload CVEs' do
          ul do
            render 'activeadmin/dashboard/import_cves'
          end
        end
      end
    end
  end
end

验证说明

修改后提交多文件时:

  • params[:files]会成为包含所有上传文件的数组,每个元素都是ActionDispatch::Http::UploadedFile对象
  • 可正常调用each遍历处理每个文件
  • 临时文件夹中的所有文件都会被正确识别和处理

内容的提问来源于stack exchange,提问作者Jens Schmidt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:10:33