Simple Form复选框默认值恒为1,如何设置未选中时返回nil
问题原因
- 你生成的HTML中存在值异常的隐藏域是核心问题:Simple Form的boolean类型输入默认会生成一个隐藏域,用来承载复选框未勾选时的提交值,你现在生成的隐藏域value为
open,而非你设置的false,说明存在配置或参数覆盖的情况:- 项目全局配置里修改了
config.boolean_unchecked_value = 'open' - 当前表单的父级配置/自定义输入组件覆写了
unchecked_value的默认值
- 项目全局配置里修改了
- 你遇到的默认值固定为1的问题,是因为Rails的布尔类型参数在接收到非false/nil/0的值时会自动转为1/true,你现在隐藏域传递的是字符串
open,会被自动识别为真值,所以才会出现不管勾没勾选都得到1/true的情况。
解决方法
临时解决(直接修复当前表单)
把你的表单输入代码修改为如下内容,直接强制指定未勾选时的返回值为nil,覆盖可能的全局配置:
= f.input :gdpr, as: :boolean, required: true, label: false, checked_value: true, unchecked_value: nil, include_hidden: true, input_html: { }
如果需要默认复选框为未勾选状态,额外增加checked: false参数即可:
= f.input :gdpr, as: :boolean, required: true, label: false, checked_value: true, unchecked_value: nil, include_hidden: true, checked: false, input_html: { }
全局修复
如果所有布尔类型输入都存在类似问题,去项目下config/initializers/simple_form.rb文件中找到config.boolean_unchecked_value配置项,修改为你需要的默认值,或者直接注释掉该配置恢复默认逻辑即可。
修改完成后重新加载页面,生成的隐藏域值会变为空,未勾选表单时后端拿到的就是nil,勾选时拿到的是true,符合你的需求。
内容的提问来源于stack exchange,提问作者user984621
相关产品推荐
相关产品推荐

