J'ai utilisé un modèle de mon application en tant que proxy pour d'autres objets qui définissent le comportement.Objets proxy avec des modèles ActiveRecord - method_missing ne fonctionne pas parfois
class Box < ActiveRecord::Base
belongs_to :box_behavior, :polymorphic => true, :validate => true, :foreign_key => 'box_behavior_id', :dependent => :destroy
[...]
def initialize(opts = {})
super(opts)
self.box_behavior = BoxBehaviorDefault.new if self.box_behavior.blank?
end
private
def method_missing(method, *args, &block)
super
rescue NoMethodError
return self.box_behavior.send(method,*args,&block)
end
end
Je mettre en œuvre toutes les méthodes sur mes objets BoxBehavior, et quand je l'appelle une méthode sur une instance de boîte il redirige l'appel vers l'objet boxbehavior associé. Tout fonctionne très bien, sauf quand j'ai essayé de créer un crochet sur mon modèle d'achat où il obtient le total de son objet boîte et l'enregistre:
class Purchase < ActiveRecord::Base
belongs_to :box
before_validation_on_create { |r| r.total = r.box.total }
end
Lorsque je tente de sauver un objet d'achat qui a une boîte associée, J'obtiens cette erreur:
undefined method `total' for #<ActiveRecord::Associations::BelongsToAssociation:0x7fe944320390>
Et je n'ai pas la moindre idée sur ce qu'il faut faire ensuite ... Quand je mets en œuvre la méthode totale directement dans la classe de boîte il fonctionne très bien ... que puis-je faire résoudre cela? Le proxy ne fonctionne pas correctement?