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_sPero 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_h

    Modificar el valor deseado

    user_params_hash[:height] = user_params_hash[:height].to_i * 100

    Crear 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 hash user_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