【问题标题】:How to permit hash with * key => values?如何使用 * key => values 允许散列?
【发布时间】:2017-02-20 13:40:57
【问题描述】:

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

这是我的代码,

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"
  }
}

然而,目前,当我尝试创建测验时,问题哈希结果为空。

【问题讨论】:

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


    【解决方案1】:

    直到现在我才看到这个:

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

    【讨论】:

    • (params[:quiz] || {})[:questions].keys
    • 你认为你能解释一下这到底是做什么的吗?有点难以理解
    • 请参阅github.com/rails/rails/issues/9454 -- 不幸的是,没有简单的方法可以说“允许此密钥包含任何内容”。 @slowjack2k 的答案是手动完成的:从字面上看,您允许 :questions 密钥包含特定的密钥列表,您可以通过询问它拥有的每个密钥来获得该列表。这适用于您的示例案例,但不幸的是不允许任意嵌套。
    • 另见stackoverflow.com/questions/18349887/…(以及“强参数允许动态”的其他结果)
    【解决方案2】:

    在 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

    【讨论】:

      【解决方案3】:

      您是否考虑过更改您的 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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      相关资源
      最近更新 更多