强参数和多维数组

时间:2014-08-08 19:02:22

标签: ruby-on-rails multidimensional-array ruby-on-rails-3.2 strong-parameters

我正在使用 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

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

2 个答案:

答案 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

如果您看到其值,则会发现它不接受Arrayvalue

为了完成这项工作,您需要做的就是将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