Rails多文件上传异常:仅获取单个文件而非全部
问题原因及解决方案
核心问题
- 表单字段名称缺少数组标识:多文件上传时,
file_field_tag的名称必须以[]结尾,Rails才会将多个上传文件解析为数组。你当前用的'files'会让Rails仅解析最后一个上传文件为单个ActionDispatch::Http::UploadedFile对象,而非数组,调用each自然会报错。 - 控制器参数获取错误:你在
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
相关产品推荐
相关产品推荐

