我正在使用 Rails 3.2.6 和strong parameters 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
指定为数组。但...
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
问题是:如何在多维数组中使用强参数?
答案 0 :(得分:4)
您也可以这样做
def permited_params
hash = params.permit(:attr1, :attr2)
hash[:attr3] = params.require(:attr3) if params.has_key?(:attr3)
hash
end
答案 1 :(得分:1)
我多次看到这种类型的问题,所以我要深入研究代码并找到原因并使其发挥作用。
无论文档中的任何内容是否正确,它都会转变。这来自强参数文档。
允许的标量类型是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