2009-01-08 23 views
6

Estoy trabajando en una aplicación de Rails que envía datos a través de un formulario. Quiero modificar algunos de los "parámetros" del formulario después de el formulario envía, pero antes de se procesa.Rieles: modifique los parámetros del formulario antes de modificar la base de datos

Lo que tengo en este momento

{"commit"=>"Create", 
    "authenticity_token"=>"0000000000000000000000000" 
    "page"=>{ 
    "body"=>"TEST", 
    "link_attributes"=>[ 
     {"action"=>"Foo"}, 
     {"action"=>"Bar"}, 
     {"action"=>"Test"}, 
     {"action"=>"Blah"} 
    ] 
    } 
} 

Lo que quiero

{"commit"=>"Create", 
    "authenticity_token"=>"0000000000000000000000000" 
    "page"=>{ 
    "body"=>"TEST", 
    "link_attributes"=>[ 
     {"action"=>"Foo", 
     "source_id"=>1}, 
     {"action"=>"Bar", 
     "source_id"=>1}, 
     {"action"=>"Test", 
     "source_id"=>1}, 
     {"action"=>"Blah", 
     "source_id"=>1}, 
    ] 
    } 
} 

¿Es esto posible? Básicamente, estoy tratando de enviar dos tipos de datos a la vez ("página" y "enlace"), y asignar el "source_id" de los "enlaces" a la "id" de la "página".

Respuesta

15

Antes de enviarlo a la base de datos puede escribir el código en el controlador que tomará los parámetros y anexará información diferente antes de guardar. Por ejemplo:

FooController < ApplicationController 

    def update 
    params[:page] ||= {} 
    params[:page][:link_attributes] ||= [] 
    params[:page][:link_attriubtes].each { |h| h[:source_id] ||= '1' } 
    Page.create(params[:page]) 
    end 

end 
+0

¿Algo más específico? –

+0

No puedo votar el ejemplo de Gaius ... pero sí, eso –

+0

No, pero extrañamente puedo votar su respuesta que he editado. –

2

También debe probablemente mirar a las devoluciones de llamada, específicamente before_validate (si está utilizando validaciones), before_save o before_create.

Es difícil darle un ejemplo específico de cómo usarlos sin saber cómo está guardando los datos, pero probablemente sería muy similar al ejemplo que dio Gaius.

2

Editar params antes de utilizar params fuertes

Ok, así que (la reactivación de esta cuestión de edad) que tenía un montón de problemas con esto, yo quería modificar un parámetro antes de que alcanzara el modelo (y mantener params fuertes) . Finalmente lo descubrí, aquí está lo básico:

def update 
    sanitize_my_stuff 
    @my_thing.update(my_things_params) 
end 

private 

def sanitize_my_stuff 
    params[:my_thing][:my_nested_attributes][:foo] = "hello" 
end 

def my_things_params 
    params.permit(etc etc) 
end 
Cuestiones relacionadas