En Rails, ¿cuál es la diferencia entre attr_accessor
y attr_accessible
? Según tengo entendido, el uso attr_accessor
se usa para crear métodos getter y setter para esa variable, de modo que podamos acceder a la variable como Object.variable
o Object.variable = some_value
.
Leí que attr_accessible
hace que esa variable específica sea accesible para el mundo exterior. ¿Puede alguien decirme cuál es la diferencia?
ruby-on-rails
ruby
felix
fuente
fuente
attr_accessor
se utiliza para generar métodos getter y setter. Consulte mi respuesta a una pregunta anterior para obtener una explicación bastante completa deattr_accessible
: stackoverflow.com/questions/2652907/… y luego actualice su pregunta si necesita otros detalles específicos después de eso.Respuestas:
attr_accessor
es un método Ruby que hace un captador y un colocador.attr_accessible
es un método Rails que le permite pasar valores a una asignación en masa:new(attrs)
oupdate_attributes(attrs)
.Aquí hay una asignación masiva:
Puede imaginar que el pedido también podría tener un código de descuento, por ejemplo
:price_off
. Si no etiqueta:price_off
yaattr_accessible
que impide que el código malicioso pueda hacer lo siguiente:Incluso si su formulario no tiene un campo para
:price_off
, si está en su modelo, está disponible de forma predeterminada. Esto significa que un POST diseñado aún podría configurarlo. El uso deattr_accessible
listas blancas es aquellas cosas que pueden asignarse en masa.fuente
attr_accessible
en la documentación de Rails? api.rubyonrails.orgattr_accessible
edgeguides.rubyonrails.org/…Muchas personas en este hilo y en google explican muy bien que
attr_accessible
especifica una lista blanca de atributos que se pueden actualizar de forma masiva ( todos los atributos de un modelo de objetos juntos al mismo tiempo ) Esto es principalmente (y solo) para proteger su aplicación del exploit pirata "Asignación masiva".Esto se explica aquí en el documento oficial de Rails: Asignación masiva
attr_accessor
es un código ruby para (rápidamente) crear métodos setter y getter en una clase. Eso es todo.Ahora, lo que falta como explicación es que cuando crea de alguna manera un enlace entre un modelo (Rails) con una tabla de base de datos, NUNCA, NUNCA, NUNCA necesita
attr_accessor
en su modelo crear creadores y captadores para poder modificar su registros de la mesa.Esto se debe a que su modelo hereda todos los métodos de la
ActiveRecord::Base
Clase, que ya define los accesos CRUD básicos (Crear, Leer, Actualizar, Eliminar) por usted. Esto se explica en el documento oficial aquí Modelo de rieles y aquí Sobrescribir acceso predeterminado (desplácese hacia abajo hasta el capítulo "Sobrescribir acceso predeterminado")Digamos por ejemplo que: tenemos una tabla de base de datos llamada "usuarios" que contiene tres columnas "nombre", "apellido" y "rol":
Instrucciones SQL:
Asumí que estableciste la opción
config.active_record.whitelist_attributes = true
en tu config / environment / production.rb para proteger tu aplicación del ataque de asignación masiva. Esto se explica aquí: Asignación masivaSu modelo Rails funcionará perfectamente con el modelo aquí abajo:
Sin embargo, deberá actualizar cada atributo de usuario por separado en su controlador para que la Vista de su formulario funcione:
Ahora para facilitar su vida, no desea hacer un controlador complicado para su modelo de Usuario. Entonces usará el
attr_accessible
método especial en su modelo de Clase:Para que pueda usar la "autopista" (asignación masiva) para actualizar:
No agregó los atributos de "rol" a la
attr_accessible
lista porque no permite que sus usuarios establezcan su rol por sí mismos (como administrador). Lo haces tú mismo en otra vista especial de administrador.Aunque su vista de usuario no muestra un campo de "rol", un pirata podría enviar fácilmente una solicitud HTTP POST que incluya "rol" en el hash de parámetros. El atributo "rol" que falta en el
attr_accessible
es proteger su aplicación de eso.Todavía puede modificar su atributo user.role por sí solo como a continuación, pero no con todos los atributos juntos.
¿Por qué demonios usarías el
attr_accessor
?Bueno, esto sería en el caso de que su formulario de usuario muestre un campo que no existe en su tabla de usuarios como una columna.
Por ejemplo, supongamos que su vista de usuario muestra un campo "por favor, dígale al administrador que estoy aquí". No desea almacenar esta información en su tabla. Solo quiere que Rails le envíe un correo electrónico advirtiéndole que un usuario "loco" ;-) se ha suscrito.
Para poder utilizar esta información, debe almacenarla temporalmente en algún lugar. ¿Qué más fácil que recuperarlo en un
user.peekaboo
atributo?Entonces agrega este campo a su modelo:
Por lo tanto, podrá hacer un uso educado del
user.peekaboo
atributo en algún lugar de su controlador para enviar un correo electrónico o hacer lo que quiera.ActiveRecord no guardará el atributo "peekaboo" en su tabla cuando lo haga
user.save
porque no ve ninguna columna que coincida con este nombre en su modelo.fuente
attr_accessor
es un método Ruby que le brinda métodos setter y getter a una variable de instancia del mismo nombre. Entonces es equivalente aattr_accessible
es un método Rails que determina qué variables se pueden establecer en una asignación en masa.Cuando envía un formulario, y tiene algo así,
MyModel.new params[:my_model]
entonces quiere tener un poco más de control, para que las personas no puedan enviar cosas que usted no desea.Puede hacerlo
attr_accessible :email
para que cuando alguien actualice su cuenta, pueda cambiar su dirección de correo electrónico. Pero no lo haríaattr_accessible :email, :salary
porque entonces una persona podría establecer su salario mediante el envío de un formulario. En otras palabras, podrían hackear su camino a un aumento.Ese tipo de información debe manejarse explícitamente. Simplemente eliminarlo del formulario no es suficiente. Alguien podría entrar con firebug y agregar el elemento en el formulario para enviar un campo de salario. Podrían usar el rizo incorporado para enviar un nuevo salario al método de actualización del controlador, podrían crear un script que envíe una publicación con esa información.
Entonces,
attr_accessor
se trata de crear métodos para almacenar variables yattr_accessible
se trata de la seguridad de las asignaciones masivas.fuente
attr_accesible
:as
!class User < ActiveRecord::Base
attr_accessor
es el código ruby y se usa cuando no tiene una columna en su base de datos, pero aún quiere mostrar un campo en sus formularios. La única forma de permitir esto esattr_accessor :fieldname
y puede usar este campo en su Vista o modelo, si lo desea, pero principalmente en su Vista.Consideremos el siguiente ejemplo
Aquí hemos utilizado
attr_reader
( atributo legible ) yattr_writer
( atributo de escritura ) para acceder al propósito. Pero podemos lograr la misma funcionalidad usandoattr_accessor
. En resumen, attr_accessor proporciona acceso a los métodos getter y setter.Entonces el código modificado es el siguiente
attr_accessible
le permite enumerar todas las columnas que desea permitir la asignación masiva. Lo opuesto a esto es loattr_protected
que significa este campo que NO quiero que nadie pueda asignar misas. Es más que probable que sea un campo en su base de datos con el que no quiera que nadie esté jugando. Como un campo de estado o similar.fuente
En dos palabras:
attr_accessor
esgetter
,setter
método mientras queattr_accessible
es decir que ese atributo particular es accesible o no. Eso es.Deseo agregar que debemos usar el parámetro Strong en lugar de
attr_accessible
protegernos de la asignación masiva.¡Salud!
fuente
Un resumen rápido y conciso de la diferencia:
fuente