开发杂货电商网站订单表单遇错误:Unpermitted parameters: :supplier, :outlet
解决订单表单中“Unpermitted parameters: :supplier, :outlet”错误
问题描述
开发杂货电商网站的订单创建表单时,管理员选择供应商和门店提交订单,后台返回错误提示:Unpermitted parameters: :supplier, :outlet,导致订单无法正常创建。
问题原因
- 表单下拉选择框的参数名是
:supplier和:outlet,但Order数据库表的关联字段为supplier_id和outlet_id,参数名与模型字段不匹配。 - 控制器强参数
order_params仅允许supplier_id和outlet_id,提交的:supplier、:outlet不在允许列表内,因此被拦截。
解决方案
1. 修改表单下拉选择框参数名
在new.html.erb中,将供应商和门店的select字段名从:supplier、:outlet改为:supplier_id、:outlet_id,label显示可保持不变:
修改前:
<%= f.label :supplier %> <%= f.select(:supplier, Supplier.all.collect { |l| [ l.name, l.id] }, {class: "form-select"}) %> <%= f.label :outlet %> <%= f.select(:outlet, Outlet.all.collect { |l| [ l.name, l.id] }, {class: "form-select"}) %>
修改后:
<%= f.label :supplier %> <%= f.select(:supplier_id, Supplier.all.collect { |l| [ l.name, l.id] }, {class: "form-select"}) %> <%= f.label :outlet %> <%= f.select(:outlet_id, Outlet.all.collect { |l| [ l.name, l.id] }, {class: "form-select"}) %>
2. 清理控制器冗余代码
OrdersController的create方法中,@supplier_id = Supplier.all和@outlet_id = Outlet.all属于冗余代码,创建订单时无需查询所有供应商/门店,直接删除即可:
修改前:
def create @order = Order.new(order_params) @supplier_id = Supplier.all @outlet_id = Outlet.all if @order.save flash[:success] = "Succesful create!" redirect_to @order else render 'new' end end
修改后:
def create @order = Order.new(order_params) if @order.save flash[:success] = "创建成功!" redirect_to @order else render 'new' end end
验证修改
修改完成后,提交订单表单时,后台接收的参数会变为supplier_id和outlet_id,与强参数配置匹配,订单即可正常保存,不再出现参数不允许的错误。
内容的提问来源于stack exchange,提问作者cherry123
相关产品推荐
相关产品推荐

