如何使用* key =>允许散列值?

时间:2016-10-11 21:24:21

标签: ruby-on-rails hash strong-parameters param

我想创建一个具有强params的对象,可以接受动态哈希键。

这是我的代码,

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 个答案:

答案 0 :(得分:4)

直到现在我才看到这个:

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

答案 1 :(得分:4)

在rails 5.1.2中,为questions传递空哈希的原始语法应该有效:

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

请参阅https://github.com/rails/rails/commit/e86524c0c5a26ceec92895c830d1355ae47a7034

答案 2 :(得分: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的工作原理。而不是给自己一个潜在的大规模注入漏洞 - 重新考虑您的域建模。你可以做得更好。