Rails允许嵌套的哈希属性

时间:2017-02-01 16:44:12

标签: ruby-on-rails json attributes nested strong-parameters

控制器接收JSON对象

{
  user: {
    name: "string",
    details: {
      info1: "string",
      info2: []
    }
  }
}

在权限期间,控制器知道可以允许某些已定义的字段(名称)和具有所有嵌套属性的哈希字段详细信息 - 也可以使用数组。这种情况的正确解决方案是什么?

糟糕的解决方案

  1. permit无法使用,因为我必须选择用户允许的字段

  2. tap do |whitelisted|无法使用,因为它不会使这些字段"允许"

  3. 以下情况不能是用户,因为数组不起作用

    details_keys = params[:user][:details].keys

    params.require(:user).permit(:name, details: details_keys)

3 个答案:

答案 0 :(得分:0)

添加空数组可能有用。你可以关闭嵌套属性的验证吗?!您是否在创建无法控制的动态随机输入字段?

答案 1 :(得分:0)

您想传递动态字段吗? 如果是这种情况,可以使用以下内容

Configuring strong parameters for dynamic keys

答案 2 :(得分:0)

如果要允许具有允许标量值数组的键,则只需将键映射到空数组:

params.permit(key: [])

允许的标量类型为String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time, DateTime, StringIO, IO, ActionDispatch::Http::UploadedFile, and Rack::Test::UploadedFile

因此,当数组包含一些非标量值(如散列)时,您必须通过在数组中同样允许嵌套键来进一步。

说,你有以下结构:

{
  key: [
    {
      attr1: 'string',
      attr2: 10
    },
    {
      attr1: 'another string',
      attr2: 100
    }
  ]
}

然后权限以这种方式进行:

params.permit(key: [:attr1, :attr2])

现在让我们假设您的案例如下:

{
  user: {
    name: "sting",
    details: {
      info1: "string",
      info2: [1, true, :sym] // assume it contains only permitted scalar values
    }
  }
}

许可将是:

params.require(:user).permit(:name, details: [:info1, info2: []])

为了使其自动化,我们假设details有5个允许标量值的属性,还有3个数组属性也只有标量值。

首先拔出details的5个非数组键:

non_array_keys = params[:user][:details].reject { |_, v| v.class == Array }.keys

接下来details内的3个数组键:

array_keys = params[:user][:details].select { |_, v| v.class == Array }.keys.map { |k| { k => [] } }

现在details_keys将准备就绪:

details_keys = non_array_keys << array_keys
details_keys.flatten!

最终许可如下:

params.require(:user).permit(:name, details: details_keys)

如果嵌套数组包含非标量值,那么我猜你已经对如何适应你的变化有了足够的想法!

免责声明:不赞赏这种自动化,因为params.require(:user).permit!的简单调用就足够了,而不是完成所有这些操作。但是这标记了:user参数哈希及其允许的任何子哈希,并且不检查允许的标量,接受任何内容。使用permit!时应格外小心,因为它将允许所有当前和未来的模型属性进行质量分配。

有关详细信息,我强烈建议您详细查看Rails official guide covering Strong Parameters