如何允许使用*键=>值的哈希表?

5
我希望创建一个使用强参数的对象,可以接受动态哈希键。
这是我的代码:
Quiz.create(quiz_params)


def quiz_params
  params.require(:quiz).permit(:user_id, :percent, :grade, questions: {})
end

传递的数据看起来可能像这样。
// the keys that get passed into question is always different

quiz: {
  user_id: 1,
  percent: 80,
  grade: "B",
  questions: {
    "12": "24",
    "1": "12",
    "4": "3",
    "5": "22"
  }
}

目前,当我尝试创建测验时,问题哈希表为空。

3个回答

9

9

到目前为止我只见过这个:

def quiz_params
  questions_params = (params[:quiz] || {})[:questions].keys
  params.require(:quiz).permit(:user_id, :percent, :grade, questions: questions_params)
end

1
(params[:quiz] || {})[:questions].keys - Eric Chu
2
你觉得你能解释一下它确切的作用吗?有点难理解。 - Eric Chu
请参阅 https://github.com/rails/rails/issues/9454 -- 不幸的是,没有简单的方法可以说“允许此键包含任何内容”。@slowjack2k的答案是手动完成的:字面上,您允许 :questions 键包含一系列特定的键,这些键是通过询问它拥有的每个键来获取的。这将适用于您的示例情况,但不幸的是不允许任意嵌套。 - gmcnaughton
请参见https://dev59.com/lmMl5IYBdhLWcg3wgnIE#34732537(以及其他“strong parameters permit dynamic”的结果) - gmcnaughton

0

你考虑过改变你的 API 吗?

quiz: {
  user_id: 1,
  percent: 80,
  grade: "B",
  answers_attributes: [
    {
      question_id: "12"
      value: "24"
    }, 
    {
      question_id: "3"
      value: "12"
    }
    # ...
  ]
}

这就是form_fornested_attributes的工作原理。与其让自己面临潜在的大规模注入漏洞,不如重新思考领域建模。你可以做得更好。


哇,谢谢!我没想到这个。我还在学习 :P - Eric Chu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接