2010-10-06 22 views
5

En los carriles, al actualizar un modelo, ¿Cómo se previene ciertas propiedades del modelo se actualice cuando se utiliza una llamada como:¿Evita que ciertas propiedades se actualicen?

@user.update_profile params[:user] 

Dado que cualquiera puede crear un formulario de entrada con un nombre como 'contraseña' , ¿cómo se puede filtrar el conjunto de propiedades que permite actualizar?

¿Para qué sirve attr_XXX?

+1

lista blanca vs lista negra, se recomienda la lista blanca. – Swanand

Respuesta

6

Está buscando attr_accessible. Le permite especificar qué atributos se pueden establecer a través de la actualización masiva (como update_attributes), pero aún podrá establecer los atributos "manualmente" (es decir, @user.attribute = ...).

Para obtener más información, vea The importance of attr_accessible in Ruby on Rails.

+0

bien, así que evitará actualizaciones masivas durante las publicaciones de formularios, ¿verdad? – Blankman

+0

@Blankman Correcto, cualquier atributo que no esté especificado como accesible no será actualizable a través de 'params'. –

4

Está buscando attr_protected para enlistar cualquier atributo que no desee alterado en una actualización masiva. Tíralo en tu modelo y dale una lista de símbolos de atributos a la lista negra.

class User < ActiveRecord::Base 
    attr_protected :password 
end 

Alternativamente, puede utilizar attr_accessible a tomar el enfoque de lista blanca y sólo los atributos dados se pueden actualizar cuando se actualiza el registro completo a la vez. Todos los demás atributos estarán protegidos.

N.B atributos protegidas todavía se pueden sobrescribir si se asigna directamente al igual que en

@user.password = "not secure" 
+2

Tenga en cuenta que 'attr_protected' y' attr_accessible' (que mencioné en mi respuesta), son dos caras de la misma moneda. 'attr_accessible' te hace una lista de los atributos que ** quieres ** para que se pueda actualizar en bloque; 'attr_protected' lista los atributos que ** no desea ** para ser actualizable. –

+0

Sin embargo, con 'attr_accessible', si alguna vez agrega más atributos a su modelo, no tendrá que preocuparse de que sean accesibles a menos que los especifique como tales; con 'attr_protected', cualquier nuevo atributo será accesible. Por supuesto, cuál es la respuesta correcta depende de lo que esperas que suceda (aunque algunas personas piensan que es preferible enumerar explícitamente lo que quieres para que no haya sorpresas). –

+0

@Daniel Vandersluis: Sí Eso es cierto. La lista blanca con attr_accessible es una estrategia de seguridad mucho mejor que la lista negra con attr_protected. Pero la forma en que se redactó la pregunta implicaba que se prefería el enfoque de la lista negra. – EmFi

Cuestiones relacionadas