强参数和多维数组

我正在使用Rails 3.2.6和强参数 gem。

所以,我有一个具有典型更新操作的控制器:

# PUT /api/resources/:id def update @resource.update_attributes! permited_params respond_with_json @resource, action: :show end 

然后,我有permited_params方法

 def permited_params params.permit(:attr1, :attr2, :attr3) end 

问题是:attr3是一个多维数组,如下所示: [[1, 2], [2, 5, 7]] :attr3 [[1, 2], [2, 5, 7]]

在文档之后,我需要指定:attr3作为数组。 但…

 params.permit(:attr1, :attr2, :attr3 => []) #inspecting permited_params: {"attr1"=>"blah", "attr2"=>"blah"} params.permit(:attr1, :attr2, :attr3 => [[]]) #inspecting permited_params: {"attr1"=>"blah", "attr2"=>"blah", "attr3" => []} params.permit(:attr1, :attr2, :attr3 => [][]) #throw error 

问题是: 如何在多维数组中使用强params?

你也可以这样做

  def permited_params hash = params.permit(:attr1, :attr2) hash[:attr3] = params.require(:attr3) if params.has_key?(:attr3) hash end 

我多次看到这种类型的问题,所以我要深入研究代码,找到原因并使其发挥作用。

无论文档中的任何内容是否正确,它都会转变。 这来自强参数文档。

允许的标量类型是String,Symbol,NilClass,Numeric,TrueClass,FalseClass,Date,Time,DateTime,StringIO,IO,ActionDispatch :: Http :: UploadedFile和Rack :: Test :: UploadedFile。

这个scalar量值存储在::ActionController::Parameters::PERMITTED_SCALAR_TYPE

如果您看到它的值,您会发现它不接受Array作为value

为了完成这项工作,您需要做的就是将Array添加到白名单中,即如果您这样做

 ::ActionController::Parameters::PERMITTED_SCALAR_TYPE << Array 

它会工作。 但这是不好的解决方案。 我不是强参数的贡献者,所以我不知道安全风险。 因此,要解决这个问题,您所要做的就是在控制器中包含类似这样的方法

 def allow_array_in_strong_parameter old_scalar_types = ::ActionController::Parameters::PERMITTED_SCALAR_TYPES.dup ::ActionController::Parameters::PERMITTED_SCALAR_TYPES << Array params.permit(:attr1, :attr2, :attr3 => []) ::ActionController::Parameters::PERMITTED_SCALAR_TYPES = old_scalar_types end