Rails中更新序列化字段时处理动态键以避免未授权参数日志的问题
Rails中更新序列化字段时处理动态键以避免未授权参数日志的问题
嘿,我刚好碰到过和你一模一样的场景——用PostgreSQL存序列化的JSON字段,前端传动态参数老是触发未授权日志,折腾了好一阵才找到合适的解决办法,给你分享几个实用方案:
方案一:调整前端传参格式(最优雅的做法)
如果能说服前端同学配合,把那些动态键嵌套到preferences字段里,问题就迎刃而解了。比如让参数变成这样:
Parameters: { "authenticity_token"=>"[FILTERED]", "block"=>{ "name"=>"我的区块", "preferences"=>{ "title_text"=>"Hello world", "layout_style"=>"center" } } }
然后在你的strong params里只需要这么写:
def block_params params.require(:block).permit(:name, preferences: {}) end
这里的preferences: {}表示允许preferences下的任意动态键,Rails就不会再报未授权参数的日志了。
方案二:后端手动映射参数(前端没法改的情况下)
如果前端架构没法调整,那咱们就在后端动手处理。思路是:先允许已知的固定字段,再把剩下的动态参数全部打包到preferences里,代码大概是这样:
def block_params # 先获取并允许已知的固定字段 permitted_attrs = params.require(:block).permit(:name) # 把block里除了已允许字段之外的所有参数,转成哈希放到preferences里 permitted_attrs[:preferences] = params[:block].except(:name).to_h permitted_attrs end
这样一来,那些动态参数会被自动收集到序列化字段里,而且不会触发未授权日志——因为我们是手动把这些参数加到了已授权的preferences键下。
小提醒
另外,既然你用的是PostgreSQL 14,其实可以考虑把preferences的字段类型从text改成jsonb,这样不仅查询更高效(支持JSON路径查询),Rails对JSON字段的序列化处理也会更原生,后续维护起来更方便。当然这是额外的优化,和当前的参数问题无关哈。
备注:内容来源于stack exchange,提问作者VegaStudios
相关产品推荐
相关产品推荐

