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:
CREATE TABLE users (
firstname string,
lastname string
role string
);
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 masiva
Su modelo Rails funcionará perfectamente con el modelo aquí abajo:
class User < ActiveRecord::Base
end
Sin embargo, deberá actualizar cada atributo de usuario por separado en su controlador para que la Vista de su formulario funcione:
def update
@user = User.find_by_id(params[:id])
@user.firstname = params[:user][:firstname]
@user.lastname = params[:user][:lastname]
if @user.save
# Use of I18 internationalization t method for the flash message
flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
end
respond_with(@user)
end
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:
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
end
Para que pueda usar la "autopista" (asignación masiva) para actualizar:
def update
@user = User.find_by_id(params[:id])
if @user.update_attributes(params[:user])
# Use of I18 internationlization t method for the flash message
flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
end
respond_with(@user)
end
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.
@user.role = DEFAULT_ROLE
¿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:
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
attr_accessor :peekaboo
end
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.
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.