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
相关产品推荐
相关产品推荐

