如何避免rails_param gem自动转换修改params参数值
rails_param关闭参数自动类型转换配置方法
rails_param默认会对声明了类型的参数执行隐式类型转换,即使传入字符串格式的数字,也会自动转成对应类型并改写原始params,不会抛出类型不匹配错误。要实现传入非Integer原始类型直接返回校验错误,可按以下方式配置:
- 优先使用内置
is_a配置项(推荐)
在param!声明参数时添加is_a: true配置,该配置会跳过默认的自动类型转换逻辑,优先校验参数的原始类型是否与声明类型完全一致,类型不匹配时直接抛出RailsParam::Param::InvalidParameterError异常,不会修改原始params的参数值。
配置示例:
配置完成后,传入param! :marks, Integer, required: true, is_a: true{"marks": "20"}这类字符串格式的参数值时,会直接触发校验失败,不会执行自动转换。 - 低版本兼容方案(无
is_a配置项时使用)
如果使用的rails_param版本较低不支持is_a选项,可以通过自定义校验块直接校验参数原始类型。
注意:声明时不要提前指定类型参数,否则会先触发默认类型转换导致校验失效。
配置示例:param! :marks, required: true do validate { |value| value.is_a?(Integer) } # 可在此处追加数值范围等其他业务校验规则 end
内容的提问来源于stack exchange,提问作者Giri
相关产品推荐
相关产品推荐

