2010-02-20 9 views
5

Tengo un campo de base de datos donde quiero almacenar mi contraseña. En un filtro before_create en mi modelo, invoco una función de cifrado y la guardo de texto claro a texto cifrado.compruebe si el valor de un campo cambió en un filtro before_update

Ahora quiero utilizar before_update para el cifrado, pero solo si el valor ha cambiado. ¿Cómo puedo escribir una condición para verificar si un valor de campo ha cambiado?

Respuesta

4

Dado que generalmente no almacena la contraseña en el modelo usando un campo que expondría al formulario, debería ser suficiente actualizarlo solo unless password.blank? y tener la contraseña real en un campo "hashed_password" que ganó ' t exponer a la forma.

Gracias a Ben (ver a continuación) para señalar que, además, proteger su contraseña cifrada con attr_protected por lo que no se puede acceder directamente/actualizar desde el formulario. +1

+0

@xaver Asegúrese de proteger el campo de atributo hash para que no se pueda escribir mediante acciones de actualización masiva a través de un formulario. – hurikhan77

+2

Puede usar attr_protected para ayudarlo con hurikhan77 descrito. – Ben

24

Si el campo se llama nombre entonces

object.name_changed? 

devolverá true.

+0

¿Esto no siempre será cierto? Rails comparará la contraseña actualizada de texto plano con la contraseña cifrada existente en la base de datos y siempre serán diferentes (creo). –

+0

@Farrel ¿uso el _cambiado? todo el tiempo y es perfecto. Gracias por dar la respuesta. Tengo un modelo que es básicamente un hoy y pertenece a un solicitante y un cesionario. Me preguntaba si hay una manera de hacer algo similar como "cambiado al cesionario". – KevinM

+0

También puede usar: 'object.changed' para obtener una matriz con todos los campos modificados – Carpetsmoker

Cuestiones relacionadas