Tengo una pregunta bastante simple. Pero no he encontrado una solución hasta ahora.
Así que aquí está la cadena JSON que envío al servidor:
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
Usando el nuevo método de permiso, tengo:
params.require(:measurement).permit(:name, :groundtruth)
Esto no arroja errores, pero la entrada de la base de datos creada contiene en null
lugar del valor de verdad.
Si acabo de configurar:
params.require(:measurement).permit!
Todo se guarda como se esperaba, pero por supuesto, esto mata la seguridad proporcionada por parámetros fuertes.
He encontrado soluciones, cómo permitir matrices, pero no un solo ejemplo con objetos anidados. Esto debe ser posible de alguna manera, ya que debería ser un caso de uso bastante común. ¿Entonces, cómo funciona?
Respuestas:
Por extraño que parezca cuando desea permitir atributos anidados, debe especificar los atributos del objeto anidado dentro de una matriz. En tu caso sería
Actualice según lo sugerido por @RafaelOliveira
Por otro lado, si quieres anidar varios objetos, entonces lo envuelves dentro de un hash ... como este
Los rieles en realidad tienen bastante buena documentación sobre esto: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
Para mayor claridad, usted podría mirar a la implementación de
permit
ystrong_parameters
en sí: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247fuente
Encontré esta sugerencia útil en mi caso:
Mira este enlace del comentario de Xavier en github.
Este enfoque incluye en la lista blanca el objeto de parámetros completos [: medición] [: verdad].
Usando los atributos de preguntas originales:
fuente
permit!
para incluirlo en la lista blanca o, de lo contrario, permanecerá sin permiso después de tocarlo. En este caso seríaparams[:measurement][:groundtruth].permit!
permit!
aumenta esteNoMethodError (undefined method
permiso de error ! ' para # <Array: 0x007f80cb71ea00>): `permit!
método @wuliwong no está disponible enArray
. Deberá tener acceso a la instancia de clase respectiva para tener accesopermit!
(ha pasado un tiempo, así que he olvidado el nombre de la clase, pero es algo así comoActionController::Parameters
basado en esta página ).Permitir un objeto anidado:
fuente
Si es Rails 5, debido a la nueva notación hash:
params.permit(:name, groundtruth: [:type, coordinates:[]])
funcionará bien.fuente