Rails中强参数中的嵌套数组

时间:2014-08-27 09:58:03

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

面对一个奇怪的问题或错误。

我有一个强参数方法的路线:

def st_params
  params.permit([:id, logs: [], metric_ids: []])
end

然后我用它来调用它,例如rspec:

post some_path(format:json, metric_ids:[ [1,0,1], [5,1,4] ])

当我调用st_params方法时,没有metric_ids参数,并且我在日志中有消息:未允许的参数:metric_ids

但如果我改变这样的st_params方法:

def st_params
  p = params.permit([:id, logs: [], metric_ids: []])
  p[:metric_ids] = params[:metric_ids]
  # or just p = params.permit!
  p
end

现在,浏览器中的一切正常,但看起来很奇怪。

但是在rspec中,我在任何情况下都收到了metric_ids的零值:(我没有找到任何关于这个问题的信息。也许这里有人可以帮助我。

提前致谢。

2 个答案:

答案 0 :(得分:4)

可能导致您麻烦的两件事:

1)bang方法permit!用于接受整个参数哈希,并且不接受任何参数。我也不确定是否可以在整个permit!哈希上调用params,文档对此不清楚。

2)您对数组表示法的使用可能会导致params哈希混乱。 (这也可能是可以接受的,但与我过去看到的情况相比看起来有点不正统。)我会把你的st_params写成

def st_params
  params.permit(:id, :log, :metric_ids)
end

此外,您编写的metric_ids: []之类的许可证参数会根据您将数据传递到上述哈希的方式将params[:metric_ids]内嵌的任何参数列入白名单,我不认为这是你的用途。看来你正在这个哈希级别存储一个数组,并且没有进一步的复杂性,所以不需要在这个范围之外将参数列入白名单。

希望这有帮助!

答案 1 :(得分:0)

我面临着同样的问题。将as: :json附加到post可以解决我的问题。

参考:https://github.com/rspec/rspec-rails/issues/1700#issuecomment-304411233