tutorial rails que ejemplos curso caracteristicas ruby-on-rails ruby

ruby-on-rails - que - ruby on rails tutorial



Diferencia entre attr_accessor y attr_accessible (6)

En Rails, ¿cuál es la diferencia entre attr_accessor y attr_accessible ? Desde mi entendimiento, usar attr_accessor se usa para crear métodos de attr_accessor y establecimiento 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 al mundo exterior. ¿Puede alguien decirme cuál es la diferencia?


En dos palabras:

attr_accessor es getter , método setter . mientras que attr_accessible es decir que un atributo particular es accesible o no. Eso es.

Deseo agregar que deberíamos usar el parámetro Strong en lugar de attr_accessible para proteger de la asignación masiva.

¡Aclamaciones!


Muchas personas en este hilo y en Google explican muy bien que attr_accessible especifica una lista blanca de atributos que pueden actualizarse 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 de "asignación masiva" pirata exploit.

Esto se explica aquí en el documento oficial de Rails: Asignación en masa

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 creas de alguna manera un enlace entre un modelo (Rails) con una tabla de base de datos, NUNCA, NUNCA, NUNCA attr_accessor en tu modelo para crear attr_accessor y attr_accessor para poder modificar Los registros de tu mesa.

Esto se debe a que su modelo hereda todos los métodos de ActiveRecord::Base Class, que ya define los accesores básicos de CRUD (Crear, Leer, Actualizar, Eliminar) para usted. Esto se explica en el documento oficial aquí Modelo Rails y aquí Sobreescribiendo el acceso predeterminado (desplácese hacia abajo hasta el capítulo "Sobreescribir el acceso predeterminado")

Por ejemplo, digamos 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 configuró la opción config.active_record.whitelist_attributes = true en su config / environment / production.rb para proteger su aplicación del exploit de asignación en masa. Esto se explica aquí: Asignación de masas

Su modelo de rieles funcionará perfectamente con el modelo a continuación:

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 crear un controlador complicado para su modelo de usuario. Por lo tanto, utilizará el método especial attr_accessible en su modelo de clase:

class User < ActiveRecord::Base attr_accessible :firstname, :lastname end

Así que puedes usar la "carretera" (asignación de masa) 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 lista attr_accessible porque no permite que los usuarios establezcan su rol por sí mismos (como admin). Lo haces tú mismo en otra vista de administrador especial.

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 attr_accessible es proteger su aplicación de eso.

Aún puede modificar su atributo user.role por sí mismo como a continuación, pero no con todos los atributos juntos.

@user.role = DEFAULT_ROLE

¿Por qué demonios attr_accessor 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, digamos que la vista de usuario muestra el campo "por favor, dile al administrador que estoy aquí". No desea almacenar esta información en su tabla. Solo desea que Rails le envíe un correo electrónico para avisarle que un usuario "loco" ;-) se ha suscrito.

Para poder hacer uso de esta información, debe almacenarla temporalmente en algún lugar. ¿Qué más fácil que recuperarlo en un atributo user.peekaboo ?

Entonces usted 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 user.peekaboo atributo user.peekaboo en algún lugar de su controlador para enviar un correo electrónico o hacer lo que desee.

ActiveRecord no guardará el atributo "peekaboo" en tu tabla cuando hagas un user.save porque no ve ninguna columna que coincida con este nombre en su modelo.


attr_accessor es código ruby ​​y se usa cuando no tiene una columna en su base de datos, pero aún desea mostrar un campo en sus formularios. La única forma de permitir esto es attr_accessor :fieldname y puede usar este campo en su Vista, o modelo, si lo desea, pero principalmente en su Vista.

Consideremos el siguiente ejemplo

class Address attr_reader :street attr_writer :street def initialize @street = "" end end

Aquí hemos utilizado attr_reader ( atributo legible ) y attr_writer ( atributo escribible ) para acceder al propósito. Pero podemos lograr la misma funcionalidad usando attr_accessor . En resumen, attr_accessor proporciona acceso a los métodos get y set.

El código tan modificado es el siguiente

class Address attr_accessor :street def initialize @street = "" end end

attr_accessible permite enumerar todas las columnas que desea permitir Asignación en masa. Lo contrario de esto es attr_protected que significa que este campo NO quiero que nadie tenga permitido Asignar en masa a. Lo más probable es que sea un campo en tu base de datos con el que no quieras que nadie juegue. Como un campo de estado, o similar.


attr_accessor es un método de Ruby que hace un getter y un setter. attr_accessible es un método de Rails que le permite pasar valores a una asignación en masa: new(attrs) o update_attributes(attrs) .

Aquí hay una tarea en masa:

Order.new({ :type => ''Corn'', :quantity => 6 })

Puede imaginar que la orden también podría tener un código de descuento, por ejemplo :price_off . Si no etiqueta :price_off como :price_off , attr_accessible que el código malicioso pueda hacerlo así:

Order.new({ :type => ''Corn'', :quantity => 6, :price_off => 30 })

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 hecho a mano todavía podría configurarlo. El uso de attr_accessible white lista aquellas cosas que pueden ser asignadas en masa.


attr_accessor es un método de Ruby que le da métodos de establecimiento y obtención a una variable de instancia del mismo nombre. Entonces es equivalente a

class MyModel def my_variable @my_variable end def my_variable=(value) @my_variable = value end end

attr_accessible es un método de Rails que determina qué variables se pueden establecer en una asignación en masa.

Cuando MyModel.new params[:my_model] un formulario y tienes algo como MyModel.new params[:my_model] entonces quieres tener un poco más de control, para que las personas no puedan enviar cosas que no quieres que envíen.

Puede hacer attr_accessible :email para que cuando alguien actualice su cuenta, pueda cambiar su dirección de correo electrónico. Pero no haría attr_accessible :email, :salary porque entonces una persona podría establecer su salario a través de un formulario de presentación. En otras palabras, podrían abrirse camino hacia un aumento.

Ese tipo de información debe ser manejada explícitamente. Simplemente eliminarlo de la forma no es suficiente. Alguien podría entrar con Firebug y agregar el elemento al formulario para enviar un campo de salario. Podrían usar el enrollamiento 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, y attr_accessible se refiere a la seguridad de las asignaciones en masa.


Un resumen de diferencias rápido y conciso:

attr_accessor es una manera fácil de crear attr_accessor lectura y escritura en su clase. Se usa cuando no tiene una columna en su base de datos, pero aún desea mostrar un campo en sus formularios. Este campo es un “virtual attribute” en un modelo de Rails.

Atributo virtual : atributo que no corresponde a una columna en la base de datos.

attr_accessible se usa para identificar los atributos a los que pueden acceder los métodos de su controlador y hace que una propiedad esté disponible para la asignación masiva. Solo permitirá el acceso a los atributos que especifique, negando el resto.