Ruby on Rails文件上传异常:无报错但头像附件未成功挂载
问题排查与解决
核心原因:参数获取错误
从请求日志的Parameters部分可以看到,上传的文件参数被封装在user哈希中:
"user"=>{"avatar"=>#<ActionDispatch::Http::UploadedFile:...>}
但你的控制器代码中直接使用了params[:avatar],这个值实际是nil,导致文件无法挂载,最终Current.user.avatar.attached?返回false,触发422状态码。
修复步骤
1. 修正控制器参数获取
修改avatar_create方法,从params[:user]中获取avatar参数:
def avatar_create Current.user.avatar.attach(params[:user][:avatar]) if Current.user.avatar.attached? redirect_to root_path else flash[:alert] = "上传失败,请重试" render :avatar_new, status: :unprocessable_entity end end
2. 额外排查点(若修复后仍有问题)
- 模型验证检查:确认
User模型是否对avatar设置了验证规则,比如:
若验证不通过,挂载会失败,可在控制器中添加调试代码查看错误:class User < ApplicationRecord has_one_attached :avatar validates :avatar, attached: true, content_type: [:png, :jpg, :jpeg] enddef avatar_create Current.user.avatar.attach(params[:user][:avatar]) if Current.user.avatar.attached? redirect_to root_path else # 打印错误信息到控制台 puts Current.user.errors.full_messages flash[:alert] = "上传失败:#{Current.user.errors.full_messages.join(', ')}" render :avatar_new, status: :unprocessable_entity end end - Turbo Stream兼容性:请求被处理为
TURBO_STREAM,若需要强制使用HTML格式,可在表单中添加format: :html:<%= form_with model: Current.user, url: avatar_path, method: :post, format: :html do |form|%> <%= form.file_field :avatar%> <%= form.submit "上传"%> <%end%>
内容的提问来源于stack exchange,提问作者Tín Ngô
相关产品推荐
相关产品推荐

