Rails+SendGrid联系表单报ActionController::ParameterMissing错误求助
问题排查:Rails联系表单SendGrid提交报错&收不到邮件
问题回顾
你在Rails应用中用SendGrid搭建联系表单时遇到了两个连锁问题:
- 提交表单时触发
ActionController::ParameterMissing报错,提示param is missing or the value is empty: message,返回400 Bad Request; - 移除控制器
message_params里的require(:message)后,浏览器不再报错,但完全收不到邮件,终端还提示存在未允许的参数。
核心错误原因
这两个问题本质上是表单参数传递不规范导致的,具体有两处关键错误:
- 表单绑定错误:你用了
form_for messages_path,但form_for需要绑定模型实例(比如@message),这样表单提交的参数才会被自动封装在:message命名空间下,对应控制器里的params.require(:message); - 字段名不匹配:模型里存储消息内容的属性是
:body(attr_accessor :body),但表单里却写了f.text_area :message,导致参数名和模型属性不匹配,即使提交了内容也会被过滤,模型的body值为空,邮件自然收不到有效内容。
分步修复方案
1. 修复联系表单代码
把你的表单代码改成以下内容,重点修正绑定逻辑和字段名:
<%= form_for @message, url: messages_path do |f| %> <div class="row"> <div class="col-lg-4 col-md-4 col-sm-12"> <%= f.text_field :name, required: true, class: "form-control", placeholder: "Votre nom" %><br> </div> <div class="col-lg-4 col-md-4 col-sm-12"> <%= f.text_field :email, required: true, class: "form-control", placeholder: "Votre email" %><br> </div> <div class="col-lg-4 col-md-4 col-sm-12"> <%= f.text_field :phone_number, required: true, class: "form-control", placeholder: "Votre numéro de téléphone" %><br> </div> </div> <%= f.text_area :body, rows: 8, cols: 40, required: true, class: "form-control", placeholder: "Votre message"%><br> <%= f.submit 'Envoyer', class: 'btn btn-secondary' %> <% end %>
- 把
form_for messages_path改成form_for @message:绑定控制器new方法里的@message实例,确保参数被封装在:message下; - 把
f.text_area :message改成f.text_area :body:对应模型的:body属性,保证参数能正确映射到模型。
2. 恢复控制器的message_params(无需修改,保留原代码)
你的message_params写法是正确的,之前报错是因为表单没传:message命名空间的参数,修复表单后这个问题会自动解决:
def message_params params.require(:message).permit(:name, :email, :phone_number, :body) end
3. 验证邮件器逻辑(无需修改,保留原代码)
你的MessageMailer和视图代码是正确的,只要模型的body有值,邮件就能正确发送内容:
# MessageMailer def contact(message) @body = message.body mail(to: 'myemail@yopmail.com', subject: 'Nouveau message !') end
验证步骤
- 重启Rails服务器,提交测试表单;
- 查看终端日志,应该能看到类似这样的参数(说明参数已正确封装在
:message下):Parameters: {"message"=>{"name"=>"测试姓名", "email"=>"test@example.com", "phone_number"=>"123456789", "body"=>"测试消息内容"}} - 检查页面是否显示成功flash消息,同时去目标邮箱查看是否收到邮件。
内容的提问来源于stack exchange,提问作者colinebrlt
相关产品推荐
相关产品推荐

