У меня довольно простой вопрос. Но пока не нашли решения.
Итак, вот строка JSON, которую я отправляю на сервер:
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
Используя новый метод разрешения, я получил:
params.require(:measurement).permit(:name, :groundtruth)
Это не вызывает ошибок, но созданная запись базы данных содержит null
вместо значения Groundtruth.
Если бы я только установил:
params.require(:measurement).permit!
Все сохраняется как ожидалось, но, конечно, это убивает безопасность, обеспечиваемую строгими параметрами.
Я нашел решения, как разрешить массивы, но не один пример использования вложенных объектов. Это должно быть как-то возможно, так как это должно быть довольно распространенным вариантом использования. Итак, как это работает?
Ответы:
Как бы странно это ни звучало, если вы хотите разрешить вложенные атрибуты, вы указываете атрибуты вложенного объекта в массиве. В вашем случае это было бы
Обновление в соответствии с предложением @RafaelOliveira
С другой стороны, если вы хотите вложить несколько объектов, вы заключаете их в хеш… вот так
Rails на самом деле имеет довольно хорошую документацию по этому вопросу: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
Для дальнейшего разъяснения вы можете посмотреть на реализацию
permit
иstrong_parameters
саму себя: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247источник
Я нашел это предложение полезным в моем случае:
Проверьте эту ссылку комментария Ксавье на github.
Этот подход помещает в белый список весь объект params [: measure] [: groundtruth].
Используя оригинальные атрибуты вопросов:
источник
permit!
чтобы попасть в белый список, иначе он остался недопустимым после нажатия. В этом случае это будетparams[:measurement][:groundtruth].permit!
permit!
вызывает этоNoMethodError (undefined method
разрешение на ошибку ! ' для # <Array: 0x007f80cb71ea00>): `permit!
Метод @wuliwong недоступен вArray
. Вам нужно будет иметь доступ к соответствующему экземпляру класса, чтобы иметь кpermit!
нему доступ (это было давно, поэтому я забыл имя класса, но это что-то вродеActionController::Parameters
основанного на этой странице ).Разрешение вложенного объекта:
источник
Если это Rails 5, из-за новой хэш-записи:
params.permit(:name, groundtruth: [:type, coordinates:[]])
будет работать нормально.источник