【问题标题】:Permit hash or nil with strong parameters允许带有强参数的 hash 或 nil
【发布时间】:2017-05-19 00:49:27
【问题描述】:

我试图通过强参数允许具有某些值的哈希或 nil 值。我现在有以下内容:

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

如果我调用此操作:

{ "parent": { "child": nil }}

Rails 不允许使用 child 参数。 (Unpermitted parameter: child)

如何让 rails 相信 nil 和哈希都是允许的?我知道您可以通过以下方式允许 nil 值:

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

但这也允许字符串值。

【问题讨论】:

  • 您是在尝试允许哈希输入,还是接受嵌套资源?这些是非常不同的用例

标签: ruby-on-rails ruby-on-rails-5 strong-parameters


【解决方案1】:

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

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 值之外的任何内容都会引发错误
  • @thiebo,我刚刚使用了我的问题中的代码,如果它不是哈希,则将孩子无效。
  • @TheRealMrCrowley 这就像说你不应该对嵌套资源使用强参数..(顺便说一句,这是用例)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 2017-02-11
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多