ruby-on-rails-3 - column - save or update rails
¿Qué es la asignación de masa en Rails 3? (1)
Asignación de masa es el nombre que Rails le da al acto de construir su objeto con un hash de parámetros. Es una "asignación masiva" en el sentido de que está asignando múltiples valores a los atributos a través de un solo operador de asignación.
Los siguientes fragmentos de código realizan la asignación en masa del name
y el atributo de topic
del modelo de Post
:
Post.new(:name => "John", :topic => "Something")
Post.create(:name => "John", :topic => "Something")
Post.update_attributes(:name => "John", :topic => "Something")
Para que esto funcione, su modelo debe permitir asignaciones en masa para cada atributo en el hash que está transmitiendo.
Hay dos situaciones en las que esto fallará:
- Tiene una declaración
attr_accessible
que no incluye:name
- Tienes un
attr_protected
que incluye:name
Recientemente se convirtió en el valor predeterminado que los atributos tenían que ser incluidos manualmente en la lista blanca a través de un attr_accessible
para que la asignación masiva tuviera éxito. Antes de esto, el valor predeterminado era que los atributos fueran asignables a menos que estuvieran explícitamente en la lista negra attr_protected
o cualquier otro atributo fuera en la lista blanca con attr_acessible.
Es importante tener en cuenta qué atributos pueden asignarse en masa porque un código como este es tan común:
@post = Post.new(params[:post])
Normalmente, esto se usa cuando el usuario envía un formulario representado por un form_for @post
. En un mundo ideal, el hash params[:post]
solo debe contener los campos que mostramos en el formulario. Sin embargo, es trivial para el usuario pasar campos adicionales en su solicitud, por lo que en realidad le está permitiendo al usuario configurar cualquier campo en @post
, no solo los que se muestran en el formulario.
La falla en el uso seguro de la asignación masiva ha llevado a varios errores de alto perfil en algunas aplicaciones bastante grandes de Rails, como la que le permitió a alguien insertar su propia clave pública en la lista de claves confiables en un repositorio Github y empujar el código directamente a un repositorio que No debería haber tenido acceso a.
He escuchado a un par de personas quejarse y publicar preguntas sobre tareas en masa en Rails. Tengo el mismo error un par de veces y todo lo que hice fue attr_accessible
. Pero, ¿qué es exactamente la asignación masiva? ¿Alguien podría explicar con el ejemplo?