unpermitted strong rails permit parameter ruby-on-rails strong-parameters

ruby-on-rails - unpermitted - rails strong parameters permit hash



Rieles: parámetros fuertes con matrices vacías (3)

foo_ids una matriz de identificaciones de asociación, digamos foo_ids a mi controlador. Para permitir una matriz de valores, uso:

params.permit(foo_ids: [])

Ahora, el problema es que si envío una matriz vacía de foo_ids , el parámetro se ignora. En lugar de borrar todos los foos como debe hacer una matriz vacía, la asociación se deja en paz, porque foo_ids no está permitido.

Esto puede deberse a que una matriz vacía se convierte en nil en rieles , y ese valor nulo se ignora, ya que los parámetros fuertes buscan una matriz de valores escalares, no un solo valor escalar.

¿Alguien puede sugerir una buena manera de resolver esto? ¡Gracias!

información adicional

En una acción de controlador de actualización, necesito poder manejar dos casos. Necesito poder establecer foo_ids en una matriz vacía. También necesito poder ignorar foo_ids si solo quiero actualizar otro campo. Estableciendo foo_ids en una matriz vacía si nil no funciona en este segundo caso.


Esto es bastante tarde, pero yo mismo tuve este problema. Lo resolví al incluir tanto la versión escalar como la versión de matriz en la declaración de permiso, de esta manera:

params.require(:photo).permit(:tags, tags: [])

FYI - tiene que tener ambos en la misma declaración de permiso - si los encadenas, serán expulsados ​​por alguna razón.

EDITAR: Me acabo de dar cuenta de que una matriz vacía enviada a través de este método se convertirá en nula - Ahora tengo un montón de campos que deben ser matrices vacías que son nulas. Entonces la solución que publiqué en realidad no funciona para mí.

EDITAR el segundo: Pensé que ya había agregado esto, pero este problema está relacionado con Rails realizando deep_munge en hash de params. Este comentario explica cómo solucionarlo: https://.com/a/25428800/130592


La solución temporal a la que he llegado es:

params[:foo_ids] ||= [] if params.has_key?(:foo_ids) params.permit(foo_ids: [])

Aquí, foo_ids se establece en una matriz vacía solo si se pasa. Si no se pasa en la solicitud, se ignorará.

Todavía estoy esperando encontrar una mejor solución para esto, ya que este tipo de cosas será bastante común en el proyecto en el que estoy trabajando, por favor sugiera mejores ideas si tiene alguna.


Tuve el mismo problema recientemente, pero ninguna de las respuestas aquí funcionó para mí. Esta es mi solución. Si tiene javascript manejando solicitudes HTTP, esto también puede funcionar para usted.

En tu lado del cliente:

if (photo.tags.length === 0){ photo.tags = ["null"] }

Y en tu PhotosController

def photo_params p = params.require(:photo).permit(tags: []) p["tags"].reject! { |tag| tag == "null" } p end