2012-06-18 6 views
9

Vorrei sapere quali campi sono stati aggiornati dopo un'istruzione update_attributes. Sto filtrando i parametri aggiornabili e cancellando quelli che non voglio aggiornati dal params[:model]. Ora, alcuni dei nuovi parametri aggiornabili potrebbero avere lo stesso valore di quello vecchio e mi piacerebbe sapere quale parametro è stato aggiornato e quale è stato saltato per lo stesso valore. Ecco parte del codice:Trovare quali campi sono stati aggiornati dopo aver chiamato update_attributes?

UPDATABLE_PARAMS = ["param1", "param2", "param3", "param4"] 
def update 
    @dr = DR.find(params[:id]) 
    authorize! :update, @dr #devise stuff 

    hnew = params[:dr] 
    hnew.delete_if {|k, v| !UPDATABLE_PARAMS.include?(k.to_s) } 

    if @dr.update_attributes(hnew) 
    @dr.update_attribute(:last_updated_by, current_user.email) 
    @dr.touch 
    end 

    render :update_result 
end 

Ecco la parte difficile:

mi piacerebbe rendere l'oggetto @dr in JSON (ma che già selezionati) e in aggiunta ai suoi campi standard, I' Mi piacerebbe aggiungere un oggetto nidificato che contenga lo updated_params. Potrei semplicemente inviare hnew come @hnew alla mia vista, ma se lo faccio otterrò tutti i parametri processati, non solo quelli che erano diversi.

Come posso ottenere i parametri modificati?

+0

La migliore pratica consiste nel gestire i parametri consentiti di massa consentiti tramite attr_accessible e utilizzando: come opzione per assegnare_attributi/update_attributes/new. –

+0

grazie viktor. Sto usando attr_accessible ma solo per nuovi record. L'aggiornamento ha diversi access accessibili che dipendono da altri fattori (come un paio di valori dei campi dei record) – Oktav

risposta

36

Mappa degli attributi che sono stati modificati quando il modello è stato salvato.

@dr.previous_changes() 
+0

Questo è davvero dannatamente divertente. Sapevo che doveva esserci un modo per farlo. Grazie. – Oktav

+0

corretto e buono a sapersi. Cancellare umilmente la mia risposta ... –