如何通过checkbox标签传递参数?Rails表单传递sale_id到控制器失败求助
问题原因
你之前的两种写法都不会将sale_id作为表单参数提交到后端:
- 直接写
sale_id: sale.id只是给checkbox的HTML标签加了一个自定义的sale_id属性 - 放到
data: {sale_id: sale.id}里是加了HTML5的data属性,仅用于前端JS读取,普通同步表单提交时不会包含这部分内容
只有name属性符合表单字段规则的输入项,才会被自动纳入Rails的params哈希中。
解决方案
根据你的业务需求选其中一种即可:
方案1:将sale_id作为checkbox的选中值提交
如果你只需要在勾选checkbox时传递对应sale_id,不需要单独的refund布尔值,可以直接把sale_id设为checkbox的选中返回值:
<%= ff.check_box :sale_id, { checked: true }, sale.id, nil %>
勾选提交后,你可以在对应嵌套参数中直接获取到sale_id的值,未勾选时该参数值为nil。
方案2:新增隐藏字段单独传sale_id
如果你需要同时保留refund布尔字段的提交,和对应sale_id的传递,直接在嵌套表单内加一个隐藏字段即可:
<%# 隐藏字段固定传对应sale_id %> <%= ff.hidden_field :sale_id, value: sale.id %> <%# 原有的refund checkbox保持逻辑不变 %> <%= ff.check_box :refund, checked: true %>
这种方式下不管checkbox是否勾选,对应的sale_id都会和refund参数一起提交到后端。
注意事项
一定要在控制器的强参数配置中添加sale_id的允许规则,否则即使参数成功提交,也会被Rails的强参数机制过滤,示例:
def 你的模型_params params.require(:你的模型名).permit( # 其他允许的顶层参数 refunds_attributes: [:id, :refund, :sale_id, :_destroy] # 嵌套参数中加入sale_id ) end
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

