Rails 6生产环境提交表单报ActionController::ParameterMissing缺少USER参数错误
报错原因
- 核心原因是表单提交的参数根键与控制器强参数要求的根键不匹配:你在视图中使用
form_for :contact生成表单,所有表单字段提交后会被包裹在contact根键下,但控制器contact_params方法中使用params.require(:user)要求参数必须存在user根键,找不到对应根键就会抛出该异常。 - 附带隐藏问题:表单中金额字段名为
paid_amount,但强参数中许可的字段为amount_paid,即便根键问题修复后,该字段值也无法正常传入模型。 - 额外逻辑问题:错误分支中
redirect_to root_path写在flash[:notice]赋值之前,会导致flash提示不生效。
解决方法
方案一(推荐,匹配现有表单定义)
修改控制器的contact_params方法,将要求的根键改为contact,同时修正许可的金额字段名与表单保持一致:
def contact_params params.require(:contact).permit(:name, :email, :phone_number, :partner_name, :partner_email, :partner_phone, :message, :paid_amount, :category) end
方案二(匹配模型命名,适合后续扩展)
修改视图的表单定义,将form_for的第一个参数改为:user,同时同步修正表单中金额字段名与强参数保持一致:
<!-- 只需要修改第一行form_for的参数,其余字段不变 --> <%= form_for :user, url: send_contact_path do |f| %>
# 对应调整表单中金额字段名,或者调整强参数许可字段,保持二者一致即可 <%= f.number_field :amount_paid, step: 0.01, placeholder: "Amount Paid" %>
附带逻辑修复
调整错误分支的代码顺序,保证flash赋值在重定向之前:
def create_contact contact = User.new(contact_params) if contact.save send_contact(contact) send_copy(contact) flash[:success] = 'Message sent successfully!' else # 先赋值flash,再执行重定向 flash[:notice] = 'Error, try again' redirect_to root_path end end
内容的提问来源于stack exchange,提问作者user14102083
相关产品推荐
相关产品推荐

