Cambiar un valor en params hash antes de guardarlo?
Por alguna razón, esto no funciona
user_params[:height] = user_params[:height].to_i * 100
User.new(user_params)
Sólo guarda el parámetro "altura" como 1.8, cuando debe ser 180 (en otras palabras, no se está cambiando como el código instruye).
¿Cómo podemos simplemente cambiar un param en el hash params antes de salvar el hash params?
lo que he intentado
Intenté lo que hay arriba.
También lo intenté user_params[:height] = (user_params[:height].to_i * 100).to_s
Pero eso tampoco funcionó.
Puedo confirmar que funciona en un hash normal:
h = {a: 1, b: 2}
=> {:a=>1, :b=>2}
h[:a] = h[:a] * 10
=> 10
h
=> {:a=>10, :b=>2}
Así que no puedo averiguar por qué no va a funcionar en los params hash
Pregunta hecha hace 3 años, 4 meses, 27 días - Por codercentaur
3 Respuestas:
-
Esta no es una respuesta adecuada, porque no puedo explicar por qué funciona, pero tuve que crear un nuevo hash para que funcione:
Reemplazar esto:
user_params[:height] = user_params[:height].to_i * 100 User.new(user_params)
con esto:
u = user_params.to_h u[:height] = u[:height].to_i * 100 User.new(u)
Entonces funciona como se esperaba
Respondida el Dec 18, 2020 a las 10:07 - por logicloom
Votos positivos: 0 | Votos negativos: 0 -
El problema que estás experimentando probablemente se deba a que los parámetros fuertes en Rails (strong parameters) son objetos ActionController::Parameters en lugar de hashes regulares. Para modificar un valor dentro de un objeto ActionController::Parameters, primero necesitas convertirlo a un hash, realizar la modificación y luego reconstruirlo como un objeto ActionController::Parameters.
Aquí te muestro cómo podrías hacerlo:
ruby
Convertir los parámetros a un hash
user_params_hash = user_params.to_hModificar el valor deseado
user_params_hash[:height] = user_params_hash[:height].to_i * 100Crear un nuevo objeto ActionController::Parameters con los parámetros modificados
modified_user_params = ActionController::Parameters.new(user_params_hash)Crear un nuevo usuario con los parámetros modificados
User.new(modified_user_params)Al convertir los parámetros a un hash, puedes aplicar las mismas operaciones que harías en un hash regular. Después, los vuelves a convertir en un objeto ActionController::Parameters para asegurarte de que cumplan con los strong parameters y evitar posibles problemas de seguridad. ¡Espero que esto te ayude a resolver el problema!
Respondida el Dec 19, 2020 a las 10:06 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema es que el hash
params
está diseñado para ser inmutable. Esto significa que no se puede cambiar el valor de una clave existente en el hash. Una solución alternativa es crear un nuevo hash con los valores modificados.Aquí tienes un ejemplo de cómo hacerlo:
new_user_params = user_params.dup new_user_params[:height] = new_user_params[:height].to_i * 100 User.new(new_user_params)
dup
crea una copia del hashuser_params
, que se puede modificar sin afectar al hash original.Respondida el Dec 19, 2020 a las 10:18 - por Gemini
Votos positivos: 0 | Votos negativos: 0