Anular el acceso de atributos del modelo en un mixin/módulo
Frecuentes
Visto 2,741 veces
5
Tengo un modelo que incluye un módulo. Me gustaría anular los métodos de acceso del modelo dentro del módulo.
Por ejemplo:
class Blah < ActiveRecord::Base
include GnarlyFeatures
# database field: name
end
module GnarlyFeatures
def name=(value)
write_attribute :name, "Your New Name"
end
end
Esto obviamente no funciona. ¿Alguna idea para lograr esto?
1 Respuestas
8
Su código parece correcto. Estamos usando este patrón exacto sin ningún problema.
Si no recuerdo mal, Rails usa #method_missing para los setters de atributos, por lo que su módulo tendrá prioridad, bloqueando el setter de ActiveRecord.
Si está utilizando ActiveSupport::Concern (ver esta entrada del blog, entonces sus métodos de instancia deben ir a un módulo especial:
class Blah < ActiveRecord::Base
include GnarlyFeatures
# database field: name
end
module GnarlyFeatures
extend ActiveSupport::Concern
included do
def name=(value)
write_attribute :name, value
end
end
end
Respondido el 02 de enero de 13 a las 21:01
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails ruby or haz tu propia pregunta.
Hmmmm. Debo estar haciendo algo mal. ¿Qué tal si amplía ActiveSuppport::Concern como parte del módulo? - KendallB
¡Impresionante! Eso ayudó. Sin embargo, no era exacto. En Rails 3.2, parece que InstanceMethods ya no está incluido: la advertencia de desaprobación simplemente decía que se incluyera el acceso en el bloque "incluido". - KendallB
Por supuesto. ActiveSupport::Concern ha pasado por algunos cambios. - tihm
¿Cuál es el punto del valor arg en el método def name=? Tal vez eso debería usarse en lugar de "Tu nuevo nombre" - justingordon
ActiveSupport::Concern
en Rails 4 necesita que definasdef self.included
en vez deincluded do
bloquear. api.rubyonrails.org/classes/ActiveSupport/Concern.html - Abdo