嵌套哈希的强参数

Top*_*gio 4 ruby ruby-on-rails strong-parameters

我有以下参数,无法获得强大的参数.

这是我的基本代码,为了简单起见,可以在Rails控制台中运行:

json = {
  id: 1,
  answers_attributes: {
    c1: { id: "", content: "Hi" },
    c2: { id: "", content: "Ho" }
  }
}

params = ActionController::Parameters.new(json)
Run Code Online (Sandbox Code Playgroud)

我读过的所有内容都说下面的内容应该可行,但它只给了我id一个空的哈希answers_attributes:

params.permit(:id, answers_attributes: [:id, :content])
=> { "id"=>1, "answers_attributes"=>{} }
Run Code Online (Sandbox Code Playgroud)

如果我代之以手动列表c1c2(如下所示)它可以工作,但这真的很愚蠢,因为我不知道用户将提供多少答案,这是很多重复:

params.permit(:id, answers_attributes: { c1: [:id, :content], c2: [:id, :content] })
=> {"id"=>1, "answers_attributes"=>{"c1"=>{"id"=>"", "content"=>"Hi"}, "c2"=>{"id"=>"", "content"=>"Ho"}}}
Run Code Online (Sandbox Code Playgroud)

我试图取代c1,并c201,但我仍然需要手工提供0,并1在我的permit语句.

如何允许未知长度的嵌套属性数组?

Dic*_*Boy 5

它的语法如下:

answers_attributes: [:id, :content]
Run Code Online (Sandbox Code Playgroud)

问题是你在使用的密钥answers_attributes.预计它们将成为answers_attributes新记录的ids 0.

更改这些会给出您的预期结果:

json = {
  id: 1,
  answers_attributes: {
    "1": { id: "", content: "Hi" },
    "2": { id: "", content: "Ho" }
  }
}

params = ActionController::Parameters.new(json)

params.permit(:id, answers_attributes:[:id, :content])
=>  {"id"=>1, "answers_attributes"=>{"1"=>{"id"=>"", "content"=>"Hi"}, "2"=>{"id"=>"", "content"=>"Ho"}}}
Run Code Online (Sandbox Code Playgroud)

编辑:看起来0不是唯一的键,我的意思是如果你有两个new记录.我使用nested_form,似乎使用了很长的随机数.