2010-10-15 23 views
1

我一直在使用我的應用程序的模型作爲定義行爲的其他對象的代理。使用ActiveRecord模型的代理對象 - method_missing有時無法工作

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 

所以我實現了我的BoxBehavior對象的所有方法,當我調用一個方法在框實例然後將呼叫重定向到相關boxbehavior對象。這一切工作正常,除了當我試圖創建我的購買模式掛鉤它從包裝盒中對象獲取的總並將其保存:

class Purchase < ActiveRecord::Base 

    belongs_to :box 

    before_validation_on_create { |r| r.total = r.box.total } 
end 

當我嘗試保存有關聯的盒子任何購買對象,我得到這個錯誤:

undefined method `total' for #<ActiveRecord::Associations::BelongsToAssociation:0x7fe944320390> 

而且我不會對下一步該怎麼做......當我在框類直接實現總方法然後正常工作的線索......我該怎麼辦解決這個問題?代理是否正常工作?

回答

1

我發現Rails並不總是使用初始化來創建模型的新實例。所以我使用了hook after_initialize並解決了問題!

相關問題