Estoy usando Ruby on Rails 3.2.2 y me gustaría saber si lo siguiente es una forma "correcta" / "correcta" / "segura" de anular un método setter para un atributo my class.
attr_accessible :attribute_name
def attribute_name=(value)
... # Some custom operation.
self[:attribute_name] = value
end
El código anterior parece funcionar como se esperaba. Sin embargo, me gustaría saber si, al usar el código anterior, en el futuro tendré problemas o, al menos, qué problemas "debería esperar" / "podrían ocurrir" con Ruby on Rails . Si esa no es la forma correcta de anular un método setter, ¿cuál es la forma correcta?
Nota : si uso el código
attr_accessible :attribute_name
def attribute_name=(value)
... # Some custom operation.
self.attribute_name = value
end
Obtuve el siguiente error:
SystemStackError (stack level too deep):
actionpack (3.2.2) lib/action_dispatch/middleware/reloader.rb:70
Respuestas:
================================================== ========================= Actualización: 19 de julio de 2017
Ahora la documentación de Rails también sugiere usar
super
así:================================================== =========================
Respuesta original
Si desea anular los métodos de establecimiento de columnas de una tabla mientras accede a través de modelos, esta es la forma de hacerlo.
Consulte Anulación de accesos predeterminados en la documentación de Rails.
Entonces, su primer método es la forma correcta de anular los establecedores de columnas en Modelos de Ruby on Rails. Rails ya proporciona estos accesorios para acceder a las columnas de la tabla como atributos del modelo. Esto es lo que llamamos mapeo ActiveRecord ORM.
También tenga en cuenta que la
attr_accessible
parte superior del modelo no tiene nada que ver con los accesorios. Tiene una funcionalidad completamente diferente (ver esta pregunta )Pero en Ruby puro, si ha definido los accesores para una clase y desea anular el setter, debe utilizar una variable de instancia como esta:
Esto será más fácil de entender una vez que sepa lo que
attr_accessor
hace. El códigoattr_accessor :name
es equivalente a estos dos métodos (getter y setter)Además, su segundo método falla porque causará un bucle infinito ya que está llamando al mismo método
attribute_name=
dentro de ese método.fuente
attr_accessible
ya que ya no está allí, y debería funcionarsuper
?super
podría no funcionar. Pero, parece que no es el caso. Lo acabo de comprobar y funciona para mí. Además, esta pregunta es la mismawrite_attribute
. Se omitirán las conversiones. Tenga en cuenta quewrite_attribute
omitirá las conversiones de zona horaria con fechas, que casi siempre serán indeseadas.Use la
super
palabra clave:Por el contrario, para anular al lector:
fuente
En rieles 4
digamos que tiene un atributo de edad en su tabla
Nota: Para los recién llegados en los rieles 4 no es necesario especificar attr_accessible en el modelo. En su lugar, debe hacer una lista blanca de sus atributos a nivel de controlador utilizando el método de permiso .
fuente
He encontrado que (al menos para las colecciones de relaciones ActiveRecord) funciona el siguiente patrón:
(Esto toma las primeras 3 entradas no duplicadas en la matriz aprobada).
fuente
Utilizando
attr_writer
para sobrescribir setter attr_writer: attribute_namefuente