Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails允许嵌套哈希属性_Ruby On Rails_Json_Attributes_Nested_Strong Parameters - Fatal编程技术网

Ruby on rails Rails允许嵌套哈希属性

Ruby on rails Rails允许嵌套哈希属性,ruby-on-rails,json,attributes,nested,strong-parameters,Ruby On Rails,Json,Attributes,Nested,Strong Parameters,控制器接收JSON对象 { user: { name: "string", details: { info1: "string", info2: [] } } } 在许可期间,控制器知道可以允许一些定义的字段(如名称)和具有所有嵌套属性的哈希字段详细信息,也可以使用数组。对于这种情况,正确的解决方案是什么 糟糕的解决方案 permit无法使用,因为我必须选择用户允许的字段 tap do | whitelisted |无法使用,因为它不会使

控制器接收JSON对象

{
  user: {
    name: "string",
    details: {
      info1: "string",
      info2: []
    }
  }
}
在许可期间,控制器知道可以允许一些定义的字段(如名称)和具有所有嵌套属性的哈希字段详细信息,也可以使用数组。对于这种情况,正确的解决方案是什么

糟糕的解决方案

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

  • tap do | whitelisted |
    无法使用,因为它不会使该字段变为“允许”

  • 下面的案例不能是用户,因为使用数组不起作用

    details\u keys=params[:user][:details]。keys

    params.require(:user).permit(:name,details:details\u key)


  • 添加空数组可能有效。您可以关闭嵌套属性的验证?!是否正在创建不受控制的动态随机输入字段?

    是否要传递动态字段? 如果是这种情况,以下方法可能有效


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

    params.permit(key: [])
    
    允许的标量类型有
    String、Symbol、NilClass、Numeric、TrueClass、FalseClass、Date、Time、StringIO、IO、ActionDispatch::Http::UploadedFile和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个数组属性也只有标量值

    首先拔出
    详细信息的5个非数组键

    non_array_keys = params[:user][:details].reject { |_, v| v.class == Array }.keys
    
    array_keys = params[:user][:details].select { |_, v| v.class == Array }.keys.map { |k| { k => [] } }
    
    接下来是
    详细信息中的3个数组键:

    non_array_keys = params[:user][:details].reject { |_, v| v.class == Array }.keys
    
    array_keys = params[:user][:details].select { |_, v| v.class == Array }.keys.map { |k| { k => [] } }
    
    现在,
    details\u键
    将在以下时间准备就绪:

    details_keys = non_array_keys << array_keys
    details_keys.flatten!
    
    如果嵌套数组将包含非标量值,那么我想您已经对如何适应更改有了足够的了解

    免责声明:这种自动化不受欢迎,因为与其做所有这些,不如简单地调用
    params.require(:user.permit)就足够了。但这会将
    :user
    参数散列及其任何子散列标记为允许的,并且不会检查允许的标量,任何内容都可以接受。使用
    许可证时应格外小心,因为它将允许对所有当前和将来的模型属性进行体量指定


    有关详细信息,我强烈建议您查看详细信息。

    我不确定您是否能够传递空数组。您是否尝试过将info2改为空字符串,并查看是否有效?嵌套对象的
    info1
    infor2
    属性是否已定义?或者它们是动态的?您好,您能解释一下为什么要编写
    2吗`不能使用tap do | whitelisted | `按钮,因为它不能使字段“允许”
    为什么它不能使字段允许?ThanksI有一个视图,有很多不同的field_标记或复选框,我只想在我的对象中将“更改”的字段作为JSON字段发送