Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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 允许具有强参数的哈希或nil_Ruby On Rails_Ruby On Rails 5_Strong Parameters - Fatal编程技术网

Ruby on rails 允许具有强参数的哈希或nil

Ruby on rails 允许具有强参数的哈希或nil,ruby-on-rails,ruby-on-rails-5,strong-parameters,Ruby On Rails,Ruby On Rails 5,Strong Parameters,我试图通过强参数允许具有特定值的哈希或nil值。我现在有以下资料: params.require(:parent).permit(child: [:attr1, :attr2]) 如果我将此行动称为: { "parent": { "child": nil }} Rails不允许使用子参数。(不允许的参数:子项) 我如何说服rails允许nil和散列?我知道您可以通过执行以下操作来允许零值: params.require(:parent).permit(:child, child: [:att

我试图通过强参数允许具有特定值的哈希或nil值。我现在有以下资料:

params.require(:parent).permit(child: [:attr1, :attr2])
如果我将此行动称为:

{ "parent": { "child": nil }}
Rails不允许使用子参数。(
不允许的参数:子项

我如何说服rails允许
nil
和散列?我知道您可以通过执行以下操作来允许零值:

params.require(:parent).permit(:child, child: [:attr1, :attr2])

但这也允许字符串值。

我认为,在这里最好的做法是通过这样做来允许所有值:

params.require(:parent).permit(:child)
这应该允许任何内容通过,即使是nil,但是通过编写自己的自定义验证来检查类型

validate :child_is_nil_or_hash
...
def child_is_nil_or_hash
  unless child.is_a?(Hash) || child.nil?
    errors.add(:child, 'must be nil or a hash')
  end
end
或者类似的东西。我没有正确测试这段代码


在本例中,您将验证的责任从参数白名单转移到Rails验证中,我认为最好的做法是允许所有值:

params.require(:parent).permit(:child)
这应该允许任何内容通过,即使是nil,但是通过编写自己的自定义验证来检查类型

validate :child_is_nil_or_hash
...
def child_is_nil_or_hash
  unless child.is_a?(Hash) || child.nil?
    errors.add(:child, 'must be nil or a hash')
  end
end
或者类似的东西。我没有正确测试这段代码


在本例中,您将验证的责任从参数白名单转移到它所属的Rails验证。

这与
params.require(:parent.permit(:child,child:[:attr1,:attr2])完全相同。
只是更不安全,因为它允许散列中的任何属性。@Roy:你找到解决方法了吗?@Roy这是正确的答案。strong params是关于设置应该允许哪些键。这绝对是不安全的。现在,对该密钥所允许的内容的验证是在它应该在的模型验证中进行的。在他上面发布的代码中,除了散列输入或nil值之外的任何东西都会抛出error@thiebo,我只是使用了我的问题中的代码,如果不是散列,则将其置为空。@TherelmrCrowley这就像是说不应该对嵌套资源使用强参数一样。。(顺便说一句,这是用例)这与
params.require(:parent)。permit(:child,child:[:attr1,:attr2])的解决方案完全相同。
只会更不安全,因为它允许散列中的任何属性。@Roy:找到解决方案了吗?@Roy这是正确的答案。strong params是关于设置应该允许哪些键。这绝对是不安全的。现在,对该密钥所允许的内容的验证是在它应该在的模型验证中进行的。在他上面发布的代码中,除了散列输入或nil值之外的任何东西都会抛出error@thiebo,我只是使用了我的问题中的代码,如果不是散列,则将其置为空。@TherelmrCrowley这就像是说不应该对嵌套资源使用强参数一样。。(顺便问一下,这是用例)您是尝试允许散列输入,还是接受嵌套资源?这些是非常不同的用例您是在尝试允许散列输入,还是接受嵌套资源?这些是非常不同的用例