2010-02-03 10 views
13

En primer lugar, he generado un andamio llamado 'artículo'Rieles: comprobación de campos modificados

Me gustaría comprobar qué campos del elemento se han modificado. y he intentado dos intentos posibles, esos no son de trabajo aunque.

¡Primer intento!

def edit 
    @item = Item.find(params[:id]) 
    @item_before_update = @item.dup 
end 

def update 
    @item = Item.find(params[:id]) 
    # compare @item_before_update and @item here, but @item_before_update is NIL !!! 
end 

Segundo intento! Busqué la manera de pasar los datos de la vista al controlador y no pude. edit.html.erb

<% @item_before_update = @item.dup %> # I thought @item_before_update can be read in update method of item controller. But NO. 
<% params[:item_before_update] = @item.dup %> # And I also thought params[:item_before_update] can be read in update mothod of item controller. But AGAIN NO 

<% form_for(@item) do |f| %> 
# omitted 
<% end %> 

Por favor, hágamelo saber cómo resolver este problema :(

Respuesta

28

atributos que tienen los cambios que no se han persistido responderá fiel a changed?

@item.title_changed? #=> true 

Puede obtener una matriz de atributos modificados utilizando changed

@item.changed #=> ['title'] 

Para su acción #update, es necesario utilizar attributes= cambiar el objeto, entonces usted puede utilizar changed y changed? antes de que persiste:

def update 
    @item = Item.find(params[:id]) 
    @item.attributes = params[:item] 
    @item.changed #=> ['title'] 
    ... do stuff 
    @item.save 
end 
+0

Esto es bueno, pero no funciona en la acción de actualización del controlador artículo. ¿Qué pasa? –

+0

He agregado un ejemplo de método de actualización. La razón por la que no estaba funcionando es que recuperó @item de la base de datos, por lo que no se modificó. Luego debe actualizarlo con sus parámetros del formulario enviado, luego puede obtener el estado "modificado" y persistir si lo desea. – Ben

+1

Creo que lo anterior debe ser Rails 3. En Rails 2, puede verificar si un atributo se cambió como: @ item.title_changed ?. (Consulte http://archives.ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects) –

Cuestiones relacionadas