2010-05-08 17 views

Respuesta

50

attr_accessor se puede utilizar para los valores que no desea almacenar en la base de datos directamente y que solo existirán durante la vida del objeto (por ejemplo, contraseñas).

attr_reader se puede utilizar como una de varias alternativas para hacer algo como esto:

def instance_value 
    "my value" 
end 
62

Nunca, a menos que lo necesite específicamente. Los accesadores automáticos respaldados por la base de datos se crean para usted, por lo que no debe preocuparse.

Cualquier attr_accessor s crea crear cambiará el @attr relevante en el objeto de rieles, pero se perderá cuando se destruya el objeto, a menos que lo vuelva a colocar en la base de datos. A veces quieres este comportamiento, pero es inusual en una aplicación de rieles.

Ahora en ruby, es una historia diferente, y terminas usándola con mucha frecuencia. Pero me sorprendería si los necesitas en rieles, especialmente al principio.

+4

perfecto - gracias. (Yo también te votaría, pero acabo de llegar aquí y parece que necesito 15 puntos primero ... Esa mecánica parece poco amigable para los usuarios nuevos.) – Ethan

+2

Nota: a partir de Rails 3.x se requiere 'attr_accessible' (de forma predeterminada) para cada modelo cuyos atributos desea permitir la escritura (por ejemplo, a través de un formulario POST). Esto se puede cambiar en 'application.rb' para compatibilidad con versiones anteriores, pero se agregó como una medida de seguridad para exigir que se incluyan explícitamente en la lista blanca atributos que _deberían ser actualizables por los usuarios. Como beneficio adicional, todos los atributos de un modelo (columnas db) son visibles allí mismo en el modelo, por lo que no tiene que recordar qué diablos se llamó esa columna :-) –

0

Un ejemplo es tener una cantidad de opciones almacenadas en una columna serializada. El creador de formularios se quejaría si intentas tener un campo de texto para una de estas opciones. Puede usar attr_accessor para simularlo, y luego en la acción de actualización guárdelo en la columna serializada.

12

Los modelos de rieles son solo clases de ruby ​​que heredan de ActiveRecord::Base. ActiveRecord emplea attr_accessor s para definir getters y setters para los nombres de columnas que hacen referencia a la tabla de la clase ruby. Es importante notar que esto es solo por persistencia; los modelos siguen siendo solo clases de rubí.

attr_accessor :foo es simplemente un acceso directo para el siguiente:

def foo=(var) 
    @foo = var 
end 

def foo 
    @foo 
end 

attr_reader :foo es simplemente un acceso directo para el siguiente:

def foo 
    @foo 
end 

attr_writer :foo es un acceso directo para el siguiente:

def foo=(var) 
    @foo = var 
end 

attr_accessor es un shor tcut para la getter y setter mientras attr_reader es el acceso directo para el captador y attr_writer es un acceso directo para sólo el colocador .

En rieles, ActiveRecord utiliza estos captadores y adaptadores de forma conveniente para leer y escribir valores en la base de datos. PERO, la base de datos es solo la capa de persistencia. Debería poder usar attr_accessor y attr_reader como lo haría con cualquier otra clase de ruby ​​para componer adecuadamente su lógica comercial.Como necesita obtener y establecer los atributos de sus objetos fuera de lo que necesita para mantenerse en la base de datos, use el attr_ s según corresponda.

Más información:

http://apidock.com/ruby/Module/attr_accessor

http://www.rubyist.net/~slagell/ruby/accessors.html

What is attr_accessor in Ruby?

+0

'attr_reader: foo' genera' método foo' getter, 'attr_writer: foo' genera' foo = 'método setter,' attr_accessor: foo' genera los métodos 'foo' y' foo = '. – Fatih

+0

+1 Fatih. Gracias por la edición. He editado mi respuesta para incluir tu comentario – brycemcd

Cuestiones relacionadas