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

Ruby on Rails 4.1+Action Mailer提交表单出现400 Bad Request求助

解决Rails 4.1 Action Mailer表单提交400错误的问题

首先看你的错误日志,事务回滚并返回400 Bad Request,核心原因是ContactSponsor模型的验证失败了,而导致验证失败的关键问题出在你的Controller代码里。

核心问题分析

你的ContactSponsorsController#create方法中,创建实例时没有传递表单参数:

@contact_sponsor = ContactSponsor.new # 这里没有传入params[:contact_sponsor]

这意味着新建的@contact_sponsor对象所有字段都是空值,而你的Model里设置了多个字段的presence: true验证,必然会导致save失败,触发事务回滚并返回400错误。

另外,从提交的参数里还能看到两个额外问题:

  • 完全没有company_size字段,但Model验证要求它必须存在
  • company_sponsor_type是空字符串,presence: true验证会把空字符串视为无效值

具体修复步骤

1. 修正Controller的create方法,添加强参数

Rails 4+要求使用强参数来过滤表单参数,同时要把参数传递给模型实例:

class ContactSponsorsController < InheritedResources::Base
  def create
    @contact_sponsor = ContactSponsor.new(contact_sponsor_params)
    if @contact_sponsor.save
      ContactSponsorMailer.delay_for(10.seconds, retry: true).create(@contact_sponsor)
      render nothing: true, status: 200
    else
      # 返回错误信息方便调试,生产环境可以根据需求调整
      render json: { errors: @contact_sponsor.errors.full_messages }, status: 400
    end
  end

  private
  # 定义强参数,允许所有需要的字段
  def contact_sponsor_params
    params.require(:contact_sponsor).permit(
      :company_name, :company_cnpj, :company_cep, :company_address,
      :company_number, :company_existence, :company_sponsor_type,
      :responsible_name, :responsible_email, :additional_infos,
      :company_size # 必须包含这个字段,因为Model验证要求它存在
    )
  end
end

2. 确保表单包含所有必填字段

检查你的前端表单,必须包含Model验证要求的所有字段,尤其是company_size——你的提交参数里完全没有这个字段,这会直接导致验证失败。同时要确保company_sponsor_type字段有默认值,或者用户必须选择一个有效选项,避免提交空字符串。

3. 调试验证错误

在开发环境中,你可以在else块里打印错误信息,快速定位问题:

else
  puts @contact_sponsor.errors.full_messages # 控制台输出错误
  render json: { errors: @contact_sponsor.errors.full_messages }, status: 400
end

这样修改后,表单参数会正确传递给模型实例,验证通过后就能正常保存并发送邮件了。

内容的提问来源于stack exchange,提问作者Felipe Marcon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:21:19