Rails 4 使用 StrongParameter 来处理用户数据白名单, 日常开发中有时会遇到这样一个问题,即嵌套的参数是一个 hash, 并且这个 hash 的 keys 是不确定的(用户可以任意输入)。

举例说明:

Contact 包含了 company 信息, company 是个 store, 其 attributes 可以自定义的, 用户提交的数据类似这样:

 {contact: {name: 'User Name', company: {c_k1: c_v1, c_k2: c_v2} }}

这个 case 的 permit 该怎么写?

其实很简单,我们可以使用 tap 方法:

def contact_params
  params.require(:contact).permit(:name).tap do |whitelisted|
    whitelisted[:company] = params[:contact][:company]
  end
end

参考资料: https://github.com/rails/rails/issues/9454#issuecomment-14167664