让我们使用一个更复杂的数据子集:
task: {
  code: "Some Task",
  enabled: '1',
  subtask_attributes: { 
    '1' => { field: 'something', rules: {length_10: true, phone: false, presence: false }} ,
    '2' => { field: 'another', rules: {length_10: true, phone: false, presence: false }} 
  }
}
所以我们将其发送到强参数进行处理:
params = ActionController::Parameters.new({
  task: {
    code: "Some Task",
    enabled: '1',
    subtask_attributes: { 
     '1' => { field: 'something', rules: {length_10: true, phone: false, presence: false }} ,
     '2' => { field: 'another', rules: {length_10: true, phone: false, presence: false }} 
    }
  }
})
我们将无法在 Rails 4 的 Strong Params 中指定 :rules ,因为它是数据的散列:
permitted = params.require(:task).permit(:code, :enabled, subtask_attributes: [:field, :rules])
Unpermitted parameter: rules
Unpermitted parameter: rules
那么,如果您想将特定属性和数据散列集合列入白名单怎么办。接受的答案不会将指定的属性列入白名单。你必须这样做:
params.require(:task).permit(
    :code, :enabled,
    subtask_attributes: [:field, :rules],
)
# whitelist the validation rules hash
params.require(:task).tap do |whitelisted|
  params[:task][:subtask_attributes].each do |k,v|
    whitelisted[:subtask_attributes][k] = params[:task][:subtask_attributes][k]
    whitelisted.permit!
  end
end
在这里尝试了几种解决方案后,都没有奏效。仅上述适用于包含任意散列数据的 has_many 关联中的嵌套属性。