2011-11-17 11 views
6

he encontrado un problema en mi solicitud y se dio cuenta de que podía solucionarlo mediante el establecimiento de :without_protection => true al crear un modelo, por ejemplo .:¿Qué podría pasar si uso: without_protection => true cuando creo un nuevo modelo en rieles 3.1?

Model.new(params[:model], :without_protection => true). 

¿Qué es exactamente raíles que protegen los modelos a partir de? ¡Gracias!

+0

Lo sé, pero ¿de qué :)? ¿Cuál podría ser el problema, cuando puedo resolverlo al no usar protección? – Ynv

+0

¿Cuál fue exactamente el problema que encontró que esto solucionó? Puede haber una solución mejor que usar ': without_protection' –

+0

Tengo una vista que implica tres modelos, dos de los cuales se crean y uno que se carga desde db. Cuando trato de guardar esto, obtengo el problema mencionado. – Ynv

Respuesta

16

Es la protección contra la asignación de masa involuntaria.

El problema con el código que muestra es que los usuarios pueden modificar el formulario y cambiar los atributos que no desea que cambien, como las contraseñas hash en los usuarios o un estado publicado en las publicaciones.

Puede usar attr_protected y attr_accessible en los modelos para proteger los atributos en sus modelos que se anularán. Cuando se protege un atributo, se ignorará el valor de params (aparecerá un aviso en su registro).

class Model < ActiveRecord::Base 
    attr_accessible :one, :two 
end 

Before Rails 3.1, eso era todo. No hubo forma de configurarlo después. Ahora, con Rails 3.1, puede asignar funciones:

class Model < ActiveRecord::Base 
    attr_accessible :one, :two, :as => :admin 
    attr_accessible :one, :as => :regular_user 
end 

y especificar que al hacer cambios masivos (new o update_attributes):

Model.new(params[:model], :as => :regular_user) 

Uso :without_protection, hará que todos los atributos libre para ser asignada de masas y debe usarse MUY con moderación. Nunca lo use cuando esté ingresando datos de usuario. Puede usarlo en db/seeds.rb por ejemplo.

+0

acabo de usarlo para semillas, para una bandera de escribir una vez (admin) –

1

Esto lo protege contra la asignación masiva.

Supongamos que, a su modelo se ve algo así:

class CreditCard 
    belongs_to :user 
end 

Usted no le gustaría que alguien va a llamar a su acción de actualización en creditcards_controller y pasar otro atributo user_id en params [: CREDIT_CARD]

Puede leer más sobre la seguridad de asignación masiva here

Cuestiones relacionadas